太拘泥于“this”的字面意思就会产生一些误解。有两种常见的对于this 的解释,但是它们都是错误的。

介绍之前先解释下什么是动态作用域

简要地分析一下动态作用域,重申它与词法作用域的区别。但实际上动态作用域是JavaScript 另一个重要机制this 的表亲。词法作用域是一套关于引擎如何寻找变量以及会在何处找到变量的规则。词法作用域最重要的特征是它的定义过程发生在代码的书写阶段(假设你没有使用eval() 或with)。动态作用域似乎暗示有很好的理由让作用域作为一个在运行时就被动态确定的形式,而不是在写代码时进行静态确定的形式,事实上也是这样的。通过示例代码来说明:

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

function foo() {
console.log( a ); // 2}function bar() {var a = 3;
foo();
}var a = 2;
bar();

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

词法作用域让foo() 中的a 通过RHS(js中赋值的一种形式) 引用到了全局作用域中的a,因此会输出2。而动态作用域并不关心函数和作用域是如何声明以及在何处声明的,只关心它们从何处调用。换句话说,作用域链是基于调用栈的,而不是代码中的作用域嵌套。因此,如果JavaScript 具有动态作用域,理论上,下面代码中的foo() 在执行时将会输出3。

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

延伸阅读

学习是年轻人改变自己的最好方式-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训学习是年轻人改变自己的最好方式