如何打破JavaScript范围

JavaScript通常遵循函数范围,即变量只能在声明它们的函数内访问。

破坏这个约定并使该变量在函数范围之外可访问的方法之一是使用全局窗口对象,例如

window.myVar = 123;

我的问题是在JavaScript / jQuery中有没有其他方法可以在函数范围之外访问变量?


没有变量声明,没有。 你显然可以在外部范围声明一个变量,以便它可以被所有后代范围访问:

var a; // Available globally
function example() {
    a = "hello"; // References a in outer scope
}

如果你不是严格模式,你可以简单地删除var关键字。 这相当于你的例子:

// a has not been declared in an ancestor scope
function example() {
    a = "hello"; // a is now a property of the global object
}

但这是非常糟糕的做法 。 如果函数在严格模式下运行,它将引发一个引用错误:

function example() {
    "use strict";
    a = "hello"; // ReferenceError: a is not defined
}

正如你写的,变量只在它们被定义的函数内部可见(除非它们是全局变量)。

你可以做的是将变量分配给函数对象本身:

function foo() {
    foo.myVar = 42;
}

console.log(foo.myVar); // outputs "undefined"
foo();
console.log(foo.myVar); // outputs "42"

但我会建议反对它。 你应该有一个很好的理由去做这样的事情。


您可以将它们定义为全局对象的一部分,然后再添加变量

// Define your global object
var myObj = {};
// Add property (variable) to it
myObj.myVar = 'Hello world';
// Add method to it
myObj.myFunctions = function() {
    // Do cool stuff
};

请参阅下面的链接:

变量声明

此外,你可以声明它没有var关键字。 但是,这可能不是一个好的做法,因为它会污染全局命名空间。 (确保严格模式没有打开)。

编辑:我发布之前没有看到其他评论。 @JamesAllardice的回答也不错。

链接地址: http://www.djcxy.com/p/97001.html

上一篇: Ways to break JavaScript Scope

下一篇: AngularJS using bind(this)