0%

This的指向问题与闭包


This的指向问题一直是JavaScript的一个容易混淆的地方,闭包与this的结合更是让人头晕,现在和大家分享一下我的学习过程

This的用法

总结起来比较常用的在三个地方

全局中

全局中,函数的调用,this基本都是指向window

点击事件中

在点击事件中,this 指向的是当前触发事件的元素对象

构造函数中

在构造函数中,this 表示的是正在初始化的对象本身

举个简单的例子

1
2
3
4
5
6
7
8
9
10
var obj = {
name:'小强',
age: 20,
run: function(){
console.log(this);
}
}
var fun = obj.run;
fun();//这样子调用,this指向的是window
obj.run();//这样调用,this指向的是obj

闭包

闭包的作用有两个:让外部访问函数内部的变量、另一个就是让这些变量的值始终保持在内存中。

实现的方法,在函数的内部在声明一个函数,返回这个函数,就可以获取到外部的变量,举个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14

function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}

var result=f1();
result(); // 999
nAdd();
result(); // 1000

也就是说,当内部函数的作用域,被外部引用时,就创建了该内部函数的闭包,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存中不会被释放,因为闭包需要他们

有两个比较经典的关于this的指向与闭包的小demo,也和大家分享一下,如果知道了原理,this的指向就不再困扰你了

第一题

1
2
3
4
5
6
7
8
9
10

var object = {
name:"My Object",
getNameFunc: function() {
return function() {
return this;
};
}
};
console.log(object.getNameFunc()());

第二题

1
2
3
4
5
6
7
8
9
10
11
12

var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
var that = this;
return function() {
return that.name;
};
}
};
console.log(object.getNameFunc()());

以上就是我对this指向的一些理解,不足之处希望大牛们多提一些意见,感激不尽

-------------本文结束感谢您的阅读-------------
没办法,总要恰饭的嘛~~