知识点
1 全局作用域和函数作用域(es6引入了块级作用域{})
2 在全局作用域中会进行预编译,创建GO对象,在函数内部创建AO对象;
有关作用域及作用域链的问题,我认为是前端必须掌握的,这里推荐下一个博客,写的不错;
https://www.cnblogs.com/jinfeixiang/p/10055113.html
面试题
var a =12;
function fn(){
console.log(a);
var a=45;
console.log(a);
}
console.log(fn)
/**
* 过程讲解
* GO{
* a : undefied -> 12
* fn: function()
* }
*
* AO{
* a : undefiend --> 45
* }
*/
var obj = {
val:2,
dbl:function(){
var val = 45;
console.log(this);
this.val*=2;
console.log(val);
console.log(this.val);
}
}
var ff = obj.dbl();
var fn=obj.dbl;
fn();
/**
* 过程讲解:360经典面试题,考察作用域和this指向问题
* 1 创建了一个对象obj,ff,fn
* 利用GO对象分析
* GO{
* obj:{}
* ff :function(){}
* fn :function(){}
* }
* 可以看出,考察this指向更多一些
* (1) var ff = obj.dbl(),函数谁调用,this指向谁,obj.dbl() == obj.dbl.call(obj),所以this指向obj
* 输出 obj,45,4
* (2) var fn = obj.dbl,fn(),相当于this指向fn,也就是window;
* 输出 window,45,undefiend
*/
推论及注意事项
没什么要注意的