JavaScript-如何理解js中的作用域和执行上下文以及相互关系?

UI设计界面 UI设计界面 主题:1059 回复:2190

JavaScript-如何理解js中的作用域和执行上下文以及相互关系?

清晨说ぺ晚安 发布于 2017-09-05 字数 0 浏览 1041 回复 3

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

归属感 2017-10-19 3 楼

变量或函数是在定义时决定而不是执行时决定.

执行一个函数会称为执行上下文的内部对象,它会将局部作用域增加到它所定义的作用域链内。JavaScript通过作用域链的局部向全局攀升方式,在特定的上下文中解析标识符。这表示,本级变量会优先于作用域链内上一级拥有相同名字的变量。

这里要注意:
一个执行上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用统一个函数会导致创建多个执行上下文,当函数执行完毕,执行上下文被销毁。每个执行下文都有自己的作用域链,用于标识符解析,当执行上下文被创建时,它的作用域链初始化为当前运行函数所包含的对象

晚风撩人 2017-10-13 2 楼

在JS中,作用域的概念和其他语言差不多, 在每次调用一个函数的时候 ,就会进入一个函数内的作用域,当从函数返回以后,就返回调用前的作用域.
JS的语法风格和C/C++类似, 但作用域的实现却和C/C++不同,并非用“堆栈”方式,而是使用列表,具体过程如下(ECMA262中所述):
任何执行上下文时刻的作用域, 都是由作用域链(scope chain)来实现.
在一个函数被定义的时候, 会将它定义时刻的scope chain链接到这个函数对象的[[scope]]属性.
在一个函数对象被调用的时候,会创建一个活动对象(也就是一个对象), 然后对于每一个函数的形参,都命名为该活动对象的命名属性, 然后将这个活动对象做为此时的作用域链(scope chain)最前端, 并将这个函数对象的[[scope]]加入到scope chain中.
http://www.laruence.com/2009/05/28/863.html

晚风撩人 2017-10-09 1 楼

先说下javascript中执行顺序的问题:
首先在页面加载的时候,对于js代码块是执行从上到下的原则进行顺序加载的,其中遇到变量的时候,则是函数定义,然后在执行变量赋值比如:

test();
function test(){
alert("Hello World!");
}

而赋值的操作,也是顺寻执行的

test();
var test = function(){
alert("Hello world!");
}

则会报错。
所以js的执行顺序是:
a.首先顺序加载
b.语法分析
c.对var以及function去做预解析
d.执行代码块

再说说作用域:这个其实一句话就是概括:JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里