var fn1 = function(){
var a=1
alert(a)
fn2=function(){
console.log(a);
}
}
fn1();
fn2();
这样的话全局的fn2,读取用到了局部函数fn1的var a=1?不符合作用域链啊?
var fn1 = function(){
var a=1
alert(a)
fn2=function(){
console.log(a);
}
}
fn1();
fn2();
这样的话全局的fn2,读取用到了局部函数fn1的var a=1?不符合作用域链啊?
这个其实相当于是闭包,fn2可以理解为全局的变量被赋为一个函数,其实可以这么理解:
// 这里有一个fn2,被赋值为`function() {console.log(a)}`
var fn1 = function(){
var a=1
alert(a)
fn2=function(){
console.log(a);
}
}
fn1();
fn2();
而JavaScript是静态作用域,也就是作用域是在定义的时候就确定了的。
所以是符合作用域链的。
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
6 回答873 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决
函数fn2就被包括在函数fn1内部,这时fn1内部的所有局部变量,对fn2都是可见的,但是对于fn2来说是改变不了fn1任何局部变量的值的。
同时fn2内部的局部变量,对fn1是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。
所以,父对象的所有变量,对子对象都是可见的,反之则不成立。