作用域最大的作用是,隔离变量,避免变量污染
var x = 10;
function fn() {
console.log(x);
}
function show(f) {
var x = 20;
(function() {
f(); // 10,而不是20
})();
}
show(fn);
作用域是创建的时候确定的,而不是调用的时候,这就是所谓的“静态作用域”
作用域与执行上下文的区别
js属于解释型预言,js的执行分为两个阶段:
1、 解释阶段
词法分析
语法分析
作用域规则确定
2. 执行阶段
创建执行上下文
执行代码
垃圾回收
js解释阶段便会确定作用域规则,因此作用域在函数定义时就已经确定了,而不是函数调用时确定,但执行上下文是函数执行之前创建的 执行上下文最明显的就是this的指向是执行时确定的。而作用域访问的变量是编写代码的机构确定的
作用域和执行上下文的最大区别就是: 执行上下文在运行时确定,随时可能改变,作用域是定义时确定,一旦确定就不会改变