JavaScript的作用域链是在函数定义时确定还是在调用时?
问题描述
看到如下的一个闭包问题
var x=10;function fn() { console.log(x);}function show(f) { var x=20; (function() {f(); })();}show(fn);
打印的是10而不是20,x在取值时不是沿着作用域链向上寻找吗,如果作用域链是在函数创建时确定结果就是10,如果是在调用时确定就应该是20,有没有关于作用域链准确的说法?这里准确的作用域链应该是什么样的?fn和show处于同一级还是fn在show内?
问题解答
回答1:作用域链是在函数定义的时候确定的.
在函数内定义的变量不能在函数之外的任何地方访问,因为变量仅仅在该函数的域的内部有定义。相对应的,一个函数可以访问定义在其范围内的任何变量和函数。换言之,定义在全局域中的函数可以访问所有定义在全局域中的变量。在另一个函数中定义的函数也可以访问在其父函数中定义的所有变量和父函数有权访问的任何其他变量。
https://developer.mozilla.org...
回答2:作用域链是动态的,所以,在调用时确定。但是你的这个代码中,闭包定义的function()是绑定的最外层的作用域function所申明的函数默认是绑定的外层的作用域
(我也是在学习中。。。)
回答3:在函数创建的时候创建一个包含全局变量对象的作用域链,储存在内部[[Scope]]属性中。函数执行的时候会创建一个执行环境,通过复制[[Scope]]属性中的对象,构建执行环境的作用域链,并把自己的活动对象推入该作用域链的前端以此形成完整的作用域链。[[Scope]]保存的是对全局变量的引用,而不是值的复制。
var a = 10;function f(){ console.log(a);};function foo(){ a = 20; f();};foo() // 20;回答4:
闭包的调用方式和下面效果等价的,下面举得例子通过对比说明了,作用域链是和函数定义时位置相关的。
var x=10;function fn(){ console.log(x);}function show() { var x=20; fn();}show(); //输出10-----------------------var x=10;function show() { var x=20; function fn(){console.log(x); } fn();}show(); //输出20
相关问题链接补充。/q/10...。有关于作用域链的讨论。
回答5:非严格模式任何IIFE的this指向都是window
以上文不对题。。。
相关文章:
1. 视频文件不能播放,怎么办?2. mysql - 把一个表中的数据count更新到另一个表里?3. 请教使用PDO连接MSSQL数据库插入是乱码问题?4. mysql 查询身份证号字段值有效的数据5. visual-studio - Python OpenCV: 奇怪的自动补全问题6. mysql - 分库分表、分区、读写分离 这些都是用在什么场景下 ,会带来哪些效率或者其他方面的好处7. node.js - nodejs开发中常用的连接mysql的库8. python bottle跑起来以后,定时执行的任务为什么每次都重复(多)执行一次?9. python - 爬虫模拟登录后,爬取csdn后台文章列表遇到的问题10. Python爬虫如何爬取span和span中间的内容并分别存入字典里?
