当前位置: 首页 > 面试题库 >

声明不带var关键字的变量

公羊绪
2023-03-14
问题内容

如果声明变量而不使用“ var”,则变量始终变为GLOBAL。

在函数内部声明全局变量是否有用?我可以想象在某个事件处理程序中声明一些全局变量,但这有什么用呢?更好地使用RAM?


问题答案:

不,没有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());     // NaN

console.log(varaible2); // 6?!?!?!

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

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

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

myNewGlobal = 42;

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

但我强烈建议您不要故意这样做:它会使代码难以阅读和维护,并且当它们变得更加普遍和普及时,这些代码将与JavaScript模块不兼容。如果确实需要在运行时从函数内部创建全局变量(已经有一个红旗,但是有充分的理由),则可以通过在其上分配一个属性window(或任何引用环境中的全局对象)来显式地进行操作;它window在浏览器上):

window.myNewGlobal = 42;

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

"use strict"; // Turns on strict mode for this compilation unit



function 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中的新增功能。)



 类似资料:
  • 本文向大家介绍JavaScript声明变量时为什么要加var关键字,包括了JavaScript声明变量时为什么要加var关键字的使用技巧和注意事项,需要的朋友参考一下 在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。 诸如此类。这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误

  • 我在网上搜索声明局部变量的方法,偶然发现了这个Oracle页面。该页面谈到了使用关键字“VAR”。 我正在使用IntelliJ,我相信我正确地将我的项目设置为使用“VAR”,但它不能正常工作。你知道我做错了什么吗? 在项目语言水平上,我也尝试了10个但没有区别。

  • 问题内容: 您使用关键字还是引发一些验证运行时异常?它给您带来什么好处,或者为什么您认为不值得使用呢? 问题答案: 如果条件为假,则声明将抛出运行时错误(AssertionError)。断言为您提供了一种简化的方式来记录,检查和强制执行代码的正确性标准。好处是用于定义和操纵这些正确性条件的语言级挂钩。如果您希望启用或禁用它们(存在一些关于是否是个好主意的争论),则可以从JVM命令行中启用。下面的一

  • 本文向大家介绍C# 委托声明的关键字是__?相关面试题,主要包含被问及C# 委托声明的关键字是__?时的应答技巧和注意事项,需要的朋友参考一下 答:delegate.  

  • 问题内容: 如果我在一个类中有以下声明,其中是抽象类型: 是否能让我仍然能够更改中的对象的状态,但阻止我将新对象添加到列表中?如果我写错了,请您解释一下正在做什么以及何时应该使用关键字。 问题答案: 不,final关键字不会使列表或其内容不可变。如果您想要一个不可变的列表,则应使用: final关键字的作用是防止您为’synapses’变量分配新值。即,您不能写: 但是,您可以编写:

  • 如果我在一个类中有以下语句,其中Synapse是一个抽象类型: 最终是否允许我仍然能够更改列表中Synapse对象的状态,但阻止我向列表中添加新的Synapse对象?如果我错了,请您解释一下final正在做什么,以及我应该在什么时候使用关键字final。