var object = {
name: "My Object",
getName: function() {
return console.log(this.name)//the window
}
};
(object.getName = object.getName)();//空
var x=10;
function foo(){
console.log(x)
}
!function(){
var x=20;
console.log(x);//20!
foo();//10!
}();
function foo2(){
var x=30;
foo();//10;
!function(){
console.log(x)//30
}()
}
foo2();
var Fn = {};
Fn.method = function(){
this.name = 'jack';
function test(){
console.log(this === window);
}
test();
}
Fn.method();//true
1.函数在定义时发生生了什么?
2.函数在不同方式调用时,又发生了什么?
3.作用域,作用域链,执行环境都是在什么时候形成的?
4.如何解释代码2中的结果?
5.函数执行的地方和函数定义的地方有什么样的联系?
6.this指向与作用域,作用域链,执行环境的关系,以及闭包的三个是什么时候创建和有效的?
7.这方面有什么文章或者书籍的章节比较清晰明朗的?
感谢各位大神,现在对整过过程还有点蒙,不知道我理解的对吗,见代码和注释
var a=1;
var fn1=function(){
console.log(this);
}
function fn2(arguments){
var a=1;
var c=1;
console.log(a,c);
function fn1_1(){
var c1=0;
console.log(c1);
}
}
function fn3(){
console.log(this);
fn2();
}
fn3();
/*
整个解释过程是这样的:
页面加载;
创建window全局对象,并生成全局作用域;
然后生成执行上下文,预解析变量(变量提升),生成全局变量对象;
然后逐行解析,执行流依次执行每行/块代码;
直至运行到fn3();
执行流将fn3压入环境栈中;
创建fn3的执行环境,创建定义域和定义域链,根据执行上文创建变量对象;
在创建变量对象的过程中沿定义域链逐级线上搜索变量,并将结果存在函数变量对象中,其中第一活动对象为arguments;
*/
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
1.
函数在定义时,会发生变量提升
例如,
会转化为
此外,函数的作用域(链)也被创建
例如:
2.
函数直接调用时,如果在非严格模式,
this指针会指向window,否则为undefined当函数以形如
bar.foo()的形式调用时,this指针会指向foofoo.call(that, a, b, c)让函数就仿佛是以that.foo(a, b, c)的形式被调用的,区别在于使用call调用时,foo无需在that的原型链上。foo.apply(that, [a, b, c])相当于foo.call(that, a, b, c)3.
ES2015 之前只有函数作用域(链),函数作用域(链)在定义时就形成了
执行环境,顾名思义,在执行时被创建
4.
正确理解 1,2,3 即可解释,不再重复阐述。
5.
正确理解 1,2,3 即可解释,不再重复阐述。
6.
正确理解 1,2,3 即可解释,不再重复阐述。
7.
参见参考资料
参考资料
ES2015 Language Specification
写了个简易的近似,模拟自己构造函数(包括作用域,形参数组等)
你问的所有问题的答案都在这里,最精确最权威的解释:Executable Code and Execution Contexts。这是原始文档,网上所有其他解释只能算二手的。
如果想彻底搞懂,请仔细一读。