栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

声明不带var关键字的变量

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

声明不带var关键字的变量

不,没有RAM好处或类似的好处。

w3schools谈论的是我所说的“内隐全球性恐怖” 。考虑以下功能:

function foo() {    var variable1, variable2;    variable1 = 5;    varaible2 = 6;    return variable1 + variable2;}

看起来很简单,但是由于线路上的错字,它返回

NaN
,而不是。并创建一个带有输入错误名称的全局变量:
11``varaible2 = 6;

function foo() {    var variable1, variable2;    variable1 = 5;    varaible2 = 6;    return variable1 + variable2;}console.log(foo());     // NaNconsole.log(varaible2); // 6?!?!?!

这是因为该函数分配给

varaible2
(注意拼写错误),但未
varaible2
在任何地方声明。通过Javascript范围链的机制,这最终是对全局对象(您可以
window
在浏览器上进行访问)的(新)属性的隐式分配。

那只是松散模式Javascript的“特征”,将其分配给一个完全未声明的标识符并不是一个错误。相反,它在全局对象上创建一个属性,并且全局对象上的属性是全局变量。(最多通过ES5,所有全局是全局对象。由于ES2015的,虽然加入了一种新的全球性不是全局对象的属性。全球范围的特性

let
const
以及
class
创建新的全球)

我的例子是一个错字,但当然,您可以根据需要故意这样做。毕竟,这是语言中明确定义的一部分。所以:

myNewGlobal = 42;

…任何

myNewGlobal
未声明的地方都会创建新的全局变量。

但我强烈建议您不要故意这样做:它会使代码难以阅读和维护,并且当它们变得更加普遍和普及时,这些代码将与Javascript模块不兼容。如果确实需要在运行时从函数内部创建全局变量(已经有一个红旗,但是有充分的理由),则可以通过在其上分配一个属性

window
(或任何引用环境中的全局对象)来显式地进行操作;它
window
在浏览器上):

window.myNewGlobal = 42;

实际上,我建议您使用ES5的strict模式。严格模式使向未声明的标识符分配错误而不是默默地创建全局变量。如果我们一直使用严格模式,那么

foo
上面的问题将更容易诊断:

"use strict"; // Turns on strict mode for this compilation unitfunction foo() {    var variable1, variable2;    variable1 = 5;    varaible2 = 6;      // <=== ReferenceError    return variable1 + variable2;}console.log(foo());

有点切线,但总的来说,我建议尽可能避免使用全局变量。全局名称空间在浏览器上已经非常混乱。浏览器使用

id
,为DOM中的每个元素创建一个全局元素,对于使用的大多数元素,该浏览器
name
都有自己的几个预定义全局变量(例如
title
),它们很容易与您的代码冲突。

相反,只需为自己定义一个不错的作用域函数并将符号放在其中即可:

(function() {    var your, symbols, here, if_they_need, to_be_shared, amongst_functions;    function doSomething() {    }    function doSomethingElse() {    }})();

如果这样做,则可能需要启用严格模式:

(function() {    "use strict";    var your, symbols, here, if_they_need, to_be_shared, amongst_functions;    function doSomething() {    }    function doSomethingElse() {    }})();

…,如上所述,它的优点是可以将未声明的标识符的分配转换为错误(以及其他各种有用的东西)。

请注意,在Jvascript 模块(ES2015中已添加,但现在才开始疯狂使用)中,默认情况下启用了严格模式。(

class
定义也是如此,这也是ES2015中的新增功能。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442124.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号