首先,我们来看一下在javascript高级程序设计里面关于this的说明:this对象是在运行时基于函数的执行环境绑定的,在全局函数中,this等于window,而当函数被作为某个对象的方法被调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window。
重点要记住这么一句话:
执行环境在哪里this指向哪里,this要在执行时才能确认,定义时无法确认。
代码论证:
var name = 'my is window';
var obj = {
name:'my is obj',
fn:function(){
console.log(this.name)
},
fn2:function(){
return function(){
console.log(this.name)
}
},
fn3:function(){
var me = this;
return function(){
console.log(me.name)
}
}
}
obj.fn();//my is obj
obj.fn2()();//my is window
obj.fn3()();//my is obj
obj.fn.call({name:'my is new obj'});//my is new obj
var fn = obj.fn;
fn();//my is window
this主要使用场景
1.在构造函数中
2.在对象中
3.在普通函数中
4.在call,apply,bind中
关于js里面的作用域
1.在es6之前没有块级作用域,只有函数作用域和全局作用域
if(true){
var str = "cc";
}
console.log(str)//cc
var str1 = "1";
function fn1(){
var str2 = "2";
function fn2(){
var str3 = "3";
console.log(str1);
console.log(str2);
console.log(str3);
}
fn2()
}
fn1()
//1
//2
//3
闭包
屌丝定义.一个能读取其它函数内部变量的函数
两个作用:
1.函数作为返回值
2.函数作为参数传递
代码演示:
function fn6(){
var s = "bibao";
return function(){
console.log(s)
}
}
var fn7 = fn6();
var s = "window";
fn7(); //bibao
function fn8(fn){
var s = "function";
fn()
}
fn8(fn7)//bibao