在高级程序设计。 标记清楚没看懂
1.什么是“当变量进入环境”。什么是“当变量离开环境”。(来个例子)
2.一个函数定义了 ,是不是必须它执行,它的执行环境才存在?执行环境里的变量对象和作用域链才有意义。
如果该函数只定义不执行。 是不是没有变量对象和作用域链?
希望大神讲详细点 最好举个简单例子
1.什么是“当变量进入环境”。什么是“当变量离开环境”。
var color = 'blue';
function changeColor(){
color = 'red;
};
changeColor();
//当调用函数changeColor时,changeColor函数在执行时会使用到外部的color变量,这个时候color变量进入环境。
//当changeColor内的代码执行完毕后,这个时候color变量离开环境。
2.一个函数定义了 ,是不是必须它执行,它的执行环境才存在?执行环境里的变量对象和作用域链才有意义。
如果该函数只定义不执行。 是不是没有变量对象和作用域链?
//每个函数都有自己的执行环境。当函数执行时,执行环境会被推入环境栈中,来执行函数中的代码,这个时候会创建当前环境的作用域链,供当前环境中的变量或者函数访问。当函数执行完,会退出执行的环境栈,销毁作用域链和相关变量。
var color = 'blue';
function changeColor(){
var a = 1;
color = ‘red‘;
};
console.log(a);//undefined
//这里color 的执行环境是window ,a的执行环境是changeColor ,当调用changeColor时会把changeColor推入到环境栈中执行,这个时候会创建作用域链,如果changeColor作用域链内找不到color 会去父级作用域链中找,找不到会报undefined。
//console.log(a);//undefined 由于window作用域链中没有a,所以undefined。
这是我的理解,相互学习,希望对你有帮助
变量的作用域吧。。。如果是var申明的变量,在起作用域内优先申明并赋值为undefined,叫做变量提升。
你肯定要执行了才形成内部变量的作用域,否则是没有的
你可以看下这个:javascript运行机制浅析
一个函数定义了 ,是不是必须它执行,它的执行环境才存在?执行环境里的变量对象和作用域链才有意义。
如果该函数只定义不执行。 是不是没有变量对象和作用域链?
希望大神讲详细点 最好举个简单例子
// 变量a在全局环境中定义
var a = 0;
function example(){
// 变量a没有在函数中定义,往父级作用域查询变量,找到全局定义的a,然后给a赋值1
a = 1;
}
console.log(a); // => 0
example();
console.log(a); // =>1
这篇文章可以帮你理清关于执行上下文(Execution Context)、变量对象(Variable Object)、作用域链(Scope Chain)的相关概念:
What is the Execution Context & Stack in JavaScript?
第二个问题你反推一下就能知道,当函数执行完毕,如果不存在闭包就会销毁作用域链。所以如果只定义不执行怎么会有作用域连意义呢。
第一个问题,变量进入环境,其实就是指函数执行过程中的变量就是进入了环境。离开环境就是指该函数执行完最后一个语句。
举个例子 var a = 1; function testFn() { a = 2; return a }; 当函数testFn执行时,执行到a = 2就是变量a进入到环境,执行完return a就是离开了环境
你知道环境就是函数的执行环境
在回应第二个问题,执行环境执行环境,没执行哪来的环境呢。记得高程有说过,当函数执行时,会先创建变量对象,所以变量对象是执行之后创建
语句不执行当然没生效啊
让我来举一个例子来回答你的两个问题:
建立一个.js文件,写以下的程序:
function b() {
var testVar;
console.log(testVar);
}
function a() {
var testVar = 2;
console.log(testVar);
b();
}
var testVar = 1;
console.log(testVar);
a();
console.log(testVar);
先思考一下,每个console.log 会输出什么?
简单来说上面的程序会生成 三个执行环境, 从上到下依次是:
b() 执行环境, 此时 testVar是undefined
a() 执行环境, 此时 testVar是 2
全局执行环境, 此时 testVar 是1
因此,console.log 的值依次是 1 ,2, undefined,1。
我们再稍微修改下以上程序:
function b() {
console.log(testVar); // 思考一下,这里的console.log会输出什么?
}
function a() {
var testVar = 2;
console.log(testVar);
b();
}
var testVar = 1;
console.log(testVar);
a();
console.log(testVar);
此时, 第一个console.log会输出 1 而不是 错误提示, 这是因为 虽然再b() 执行环境中,没有定义testVar, 但是在
希望这个例子对你理解这两个问题有所帮助。
首先楼主先搞清楚作用域链与执行时环境的区别
1.作用域链是函数定义后就有的,不管是不是执行
function a(){
var o1=1;
console.log(o2);//不管怎么执行,都不可以访问o2
function b(){
var o2=2;
console.log(o1);//不管怎么执行,都可以访问o1
}
}
2.执行时环境是当代码运行到当前行的环境,最著名的就是this了,不同的运行时环境,this指向是不同的(构造函数,普通执行,call和apply等)