首页 > JS中作用域

JS中作用域

 

var scope = 'global';
var f = function () {
console.log(scope); // 输出 undefined
var scope = 'f';
}
f();

 



上面代码可能和你预想的不一样,没有输出 global, 而是undefined,这是为什么呢?

这是 JavaScript 的一个特性,按照作用域搜索顺序,在 console.log 函数访问 scope 变

量时, JavaScript 会先搜索函数 f 的作用域,恰巧在 f 作用域里面搜索到 scope 变量,

所以上层作用域中定义的 scope 就被屏蔽了,但执行到 console.log 语句时, scope 还

没被定义,或者说初始化,所以得到的就是 undefined 值了

 

 1 var f = function() {
 2   var scope = 'f0';
 3   (function() {
 4     var scope = 'f1';
 5     (function() {
 6       console.log(scope); // 输出 f1
 7     })();
 8   })();
 9 };
10 f();

 



上面是一个函数作用域嵌套的例子,我们在最内层函数引用了 scope 变量,通过作用

域搜索,找到了其父作用域中定义的 scope 变量。

有一点需要注意:函数作用域的嵌套关系是定义时决定的,而不是调用时决定的,也就

是说, JavaScript 的作用域是静态作用域,又叫词法作用域,这是因为作用域的嵌套关系可

以在语法分析时确定,而不必等到运行时确定。下面的例子说明了这一切:

var scope = 'top';
var f1 = function() {console.log(scope);
};
f1(); // 输出 top
var f2 = function() {var scope = 'f2';f1();
};
f2(); // 输出 top

 



这个例子中,通过 f2 调用的 f1 在查找 scope 定义时,找到的是父作用域中定义

的 scope 变量,而不是 f2 中定义的 scope 变量。这说明了作用域的嵌套关系不是在调用

时确定的,而是在定义时确定的

转载于:https://www.cnblogs.com/Hizy/p/6689683.html

更多相关:

  • javascript的作用域是一个老生常谈的问题了。高程啊,或是各种书籍上都有关于javascript的作用域的阐述。这一次看了,《你不知道的JavaScript》里关于作用域的描述,感觉挺不错的。 编译 JavaScript是脚本语言,解释型语言,很多人可能认为它要跟其他的编译型语言划分界限,毫不相干。但是JavaScript确实是...

  • JavaScript采用的是词法作用域 1.词法作用域 即函数定义时,即确定的作用域。js中的作用域链,在函数声明时候,就已经确定了,无论函数在何处调用,其作用域变量的查找都是按照定义是包含关系去查找。 2.动态作用域 变量的作用域与函数的调用地点有关,在不同的函数中调用,变量的查找会沿着调用函数向上查找。 举例: var a =...

  • //获取某一个cookie的值 const getCookie = key => {var k = key, dc = document.cookie;if (dc.length > 0) {var s = dc.indexOf(k + "=");if (s != -1) {s = s + k.length + 1;var e = d...

  • var SGheadMapPoints = {/*obj={ maxLng: minLng: maxLat: minLat: maxCount:最大人数 minCount:最小人数 total:点位数量 }*/get: function (obj) {var arr = [];obj.maxCount || (obj.maxCount...

  • //自动搜索指定的请柬 var alertTipText = "请柬找到了,就在这个网页里面,自己仔细看吧"; var delay = 1 * 1000;//1秒后循环下一页寻找 /*获取子DOM元素在父元素里面的索引位置(是第几个元素)*/ function getNodeListIndex(childNode) {return c...

  •  获取天气情况(不支持跨域) /*json原生获取*/ function getJSON() {var XML;var url = "http://wthrcdn.etouch.cn/weather_mini?city=杭州";if (window.XMLHttpRequest) {XML = new XMLHttpRequest(...