打破JavaScript作用域的方法

打破JavaScript作用域的方法,javascript,jquery,Javascript,Jquery,JavaScript通常遵循函数范围,即变量只能在声明它们的函数中访问 打破此约定并使变量在函数范围外可访问的方法之一是使用全局窗口对象 e、 g 我的问题是JavaScript/jQuery中是否有其他方法可以使变量在函数作用域之外可访问?不使用变量声明,不。显然,您可以在外部作用域中声明变量,以便所有子作用域都可以访问它: var a; // Available globally function example() { a = "hello"; // References a in

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

打破此约定并使变量在函数范围外可访问的方法之一是使用全局窗口对象 e、 g


我的问题是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
}

不使用变量声明。显然,您可以在外部作用域中声明变量,以便所有子作用域都可以访问它:

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"

但我建议不要这样做。您应该有很好的理由这样做。

正如您所写,变量只在定义它们的函数中可见(除非它们是全局变量)

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

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关键字的情况下声明它。但是,这可能不是一个好的做法,因为它会污染全局名称空间。(确保严格模式未启用)

编辑:
在发布之前,我没有看到其他评论@jamesalardice的答案也很好。

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

// 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关键字的情况下声明它。但是,这可能不是一个好的做法,因为它会污染全局名称空间。(确保严格模式未启用)

编辑:
在发布之前,我没有看到其他评论@jamesalardice的答案也很好。

基本上,用
var
声明的每个变量都是局部变量。如果你忽略它,你将在更高的范围内设置变量的值(全局或非全局),或者如果它不存在,将其设置为全局。我不完全理解你的问题。你不能声明一个全局变量吗?你可以检查这个问题你的目的是什么?因为有几种方法可以做到这一点。问题是,在一个特定的情况下,最好的/优雅的方法是什么。我只是想了解使变量“在”函数“外部可访问”的不同方法。基本上,用
var
声明的每个变量都是局部变量。如果你忽略它,你将在更高的范围内设置变量的值(全局或非全局),或者如果它不存在,将其设置为全局。我不完全理解你的问题。你不能声明一个全局变量吗?你可以检查这个问题你的目的是什么?因为有几种方法可以做到这一点。问题是,在一个特定的情况下,最好的/优雅的方法是什么。我只是想了解使变量“在”函数“外部可访问”的不同方法