理解JavaScript中的作用域和上下文

理解JavaScript中的作用域和上下文

ID:38590485

大小:109.00 KB

页数:14页

时间:2019-06-15

理解JavaScript中的作用域和上下文_第1页
理解JavaScript中的作用域和上下文_第2页
理解JavaScript中的作用域和上下文_第3页
理解JavaScript中的作用域和上下文_第4页
理解JavaScript中的作用域和上下文_第5页
资源描述:

《理解JavaScript中的作用域和上下文》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、优就业JS教程-理解JavaScript中的作用域和上下文 Java对于作用域(Scope)和上下文(Context)的实现是这门语言的一个非常独到的地方,部分归功于其独特的灵活性。函数可以接收不同的的上下文和作用域。这些概念为Java中的很多强大的设计模式提供了坚实的基础。然而这也概念也非常容易给开发人员带来困惑。为此,本文将全面的剖析这些概念,并阐述不同的设计模式是如何利用它们的。  Statement  作者:景庄,Web开发者,主要关注Java、Node.js、React、Docker等。  上下文(Context)和

2、作用域(Scope)  首先需要知道的是,上下文和作用域是两个完全不同的概念。多年来,我发现很多开发者会混淆这两个概念(包括我自己),错误的将两个概念混淆了。平心而论,这些年来很多术语都被混乱的使用了。  函数的每次调用都有与之紧密相关的作用域和上下文。从根本上来说,作用域是基于函数的,而上下文是基于对象的。换句话说,作用域涉及到所被调用函数中的变量访问,并且不同的调用场景是不一样的。上下文始终是this关键字的值,它是拥有(控制)当前所执行代码的对象的引用。  变量作用域  一个变量可以被定义在局部或者全局作用域中,这建立了

3、在运行时(runtime)期间变量的访问性的不同作用域范围。任何被定义的全局变量,意味着它需要在函数体的外部被声明,并且存活于整个运行时(runtime),并且在任何作用域中都可以被访问到。在ES6之前,局部变量只能存在于函数体中,并且函数的每次调用它们都拥有不同的作用域范围。局部变量只能在其被调用期的作用域范围内被赋值、检索、操纵。  需要注意,在ES6之前,Java不支持块级作用域,这意味着在if语句、switch语句、for循环、while循环中无法支持块级作用域。也就是说,ES6之前的Java并不能构建类似于Java中

4、的那样的块级作用域(变量不能在语句块外被访问到)。但是,从ES6开始,你可以通过let关键字来定义变量,它修正了var关键字的缺点,能够让你像Java语言那样定义变量,并且支持块级作用域。看两个例子:  ES6之前,我们使用var关键字定义变量:  functionfunc(){  if(true){  vartmp=123;  }  console.log(tmp);//123  }  之所以能够访问,是因为var关键字声明的变量有一个变量提升的过程。而在ES6场景,推荐使用let关键字定义变量:  functionfunc

5、(){  if(true){  lettmp=123;  }  console.log(tmp);//ReferenceError:tmpisnotdefined  }  这种方式,能够避免很多错误。  什么是this上下文  上下文通常取决于函数是如何被调用的。当一个函数被作为对象中的一个方法被调用的时候,this被设置为调用该方法的对象上:  varobj={  foo:function(){  alert(this===obj);  }  };  obj.foo();//true  这个准则也适用于当调用函数时使用new

6、操作符来创建对象的实例的情况下。在这种情况下,在函数的作用域内部this的值被设置为新创建的实例:  functionfoo(){  alert(this);  }  newfoo()//foo  foo()//window  当调用一个为绑定函数时,this默认情况下是全局上下文,在浏览器中它指向window对象。需要注意的是,ES5引入了严格模式的概念,如果启用了严格模式,此时上下文默认为undefined。  执行环境(executioncontext)  Java是一个单线程语言,意味着同一时间只能执行一个任务。当Ja

7、va解释器初始化执行代码时,它首先默认进入全局执行环境(executioncontext),从此刻开始,函数的每次调用都会创建一个新的执行环境。  这里会经常引起新手的困惑,这里提到了一个新的术语——执行环境(executioncontext),它定义了变量或函数有权访问的其他数据,决定了它们各自的行为。它更偏向于作用域的作用,而不是我们前面讨论的上下文(Context)。请务必仔细的区分执行环境和上下文这两个概念(注:英文容易造成混淆)。说实话,这是个非常糟糕的命名约定,但是它是ECMA规范制定的,你还是遵守吧。  每个函数

8、都有自己的执行环境。当执行流进入一个函数时,函数的环境就会被推入一个环境栈中(executionstack)。在函数执行完后,栈将其环境弹出,把控制权返回给之前的执行环境。ECMA程序中的执行流正是由这个便利的机制控制着。  执行环境可以分为创建和执行两个阶段。在创建阶段,解

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。