我正在尝试理解(可能是简单的概念)关于 JS 的内容,并且我将下面的代码放在一起来解释我没有得到的东西。我不明白的是 name 变量的存储位置。这个变量现在是全局的吗?
(function($) {
var name = '';
$.helloWorld = function(yourName) {
name = yourName;
console.log("Hello " + yourName);
}
}(jQuery));
我正在尝试理解(可能是简单的概念)关于 JS 的内容,并且我将下面的代码放在一起来解释我没有得到的东西。我不明白的是 name 变量的存储位置。这个变量现在是全局的吗?
(function($) {
var name = '';
$.helloWorld = function(yourName) {
name = yourName;
console.log("Hello " + yourName);
}
}(jQuery));
该name
变量是外部函数的局部变量,因为它是用var
关键字声明的。内部函数是一个包含对该变量的引用的闭包。这是一个更好的例子来展示这一点:
(function($) {
var name = '';
$.setName = function(newName) {
name = newName;
}
$.showName = function() {
console.log("Name is: " + name);
}(jQuery));
定义后,您可以执行以下操作:
$.setName("Larry");
$.showName();
$.setName("Fred");
$.showName();
这应该可以帮助您理解:
(function(){
var name;
var scope1;
// Here you can use scope1 and name
(function(){
var name; // <------------------------
var scope2; // |
// |
// Here you can use scope1,scope2, and name
(function(){
var name; // <------------------------------
var scope3; // |
// |
// Here you can use scope1,scope2,scope3, and name
})();
})();
})();
// Any\variable declared outside of any function scope is in the global scope.
// A variable declared here can be accessed by window.name from any scope
var name = 5;
因此,在此代码段中,三个函数创建了 3 个作用域,在最里面,您可以访问具有唯一名称的变量(作用域 1、作用域 2 和作用域 3)以及局部变量name
,它与它的名字不同中间范围。像这样重用变量名来防止访问外部范围内的变量称为遮蔽。
请注意,未使用关键字声明的变量var
被自动假定为在全局范围内。在全局范围内声明许多变量是一种不好的做法,因为它们很容易与其他脚本发生冲突。