发表于: 2017-05-22 22:45:43
1 1018
JS中this的指向
小课堂【成都第144期】
分享人:王帅
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
1.背景介绍
JavaScript 中的 this 含义十分丰富,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下几种方式:作为对象方法调用,作为函数调用,作为构造函数调用,和使用 apply 或 call 调用。下面我们将按照调用方式的不同,分别讨论 this 的含义。
2.知识剖析
全局环境中的this
this.a2 = 20;
console.log(this);
总结:在全局作用域中它的 this 执行当前的全局对象(浏览器端是 Window)
严格模式与非严格模式下的this
function fn() {
'use strict'; //严格模式
console.log(this);
}
fn(); // undefined
window.fn(); // Window
function fn() {
console.log(this);
}
fn(); // Window
window.fn(); // Window
原因:在非严格模式中,当this指向undefined时,它会被自动指向全局对象。
this由调用者提供,由调用函数的方式来决定。如果调用者函数,被某一个对象所拥有,那么该函数在调用时,内部的this指向该对象。如果函数独立调用,那么该函数内部的this,则指向undefined。但是在非严格模式中,当this指向undefined时,它会被自动指向全局对象。
普通的例子
var a = 20;
var foo = {
a: 10,
getA: function () {
return this.a;
}
}
console.log(foo.getA()); // 10
var test = foo.getA;
console.log(test()); // 20
foo.getA()中,getA是调用者,他不是独立调用,被对象foo所拥有,因此它的this指向了foo。而test()作为调用者,尽管他与foo.getA的引用相同,但是它是独立调用的,因此this指向undefined,在非严格模式,自动转向全局window。
使用call,apply显示指定this
var a = 4;
function fn() {
console.log(this.a);
}
var obj = {
a: 20
};
fn();
fn.call(obj);
call:调用一个对象的一个方法用另一个对象替换当前对象。
apply:应用某一对象的一个方法用另一个对象替换当前对象。
构造函数与原型方法上的this
//构造函数
function Person(name, age) {
this.name = name;
this.age = age;
}
//原型方法
Person.prototype.getName = function() {
return this.name;
}
var p1 = new Person('Nick', 20);
console.log(p1.getName());
当new操作符调用构造函数时,this其实指向的是这个新创建的对象,最后又将新的对象返回出来,被实例对象p1接收。而原型方法上的this,p1.getName()中的getName为调用者,他被p1所拥有,因此getName中的this,也是指向了p1。
3、常见问题
特殊的例子
var a = 20;
var obj = {
a: 10,
c: this.a + 20,
fn: function () {
return this.a;
}
}
console.log(obj.c); //40
console.log(obj.fn()); //10
4、解决方案
var a = 20;
var obj = {
a: 10,
c: this.a + 20,
fn: function () {
return this.a;
}
}
console.log(obj.c); //40
console.log(obj.fn()); //20
对象obj中的c属性使用this.a + 20来计算,而他的调用者obj.c并非是一个函数。因此他不适用调用者的规则。当obj在全局声明时,无论obj.c在什么地方调用,这里的this都指向全局对象,而当obj在函数环境中声明时,这个this指向undefined,在非严格模式下,会自动转向全局对象。
5、编码实战
6.扩展思考
如何理解this?
当一个函数被调用时,拥有它的object会作为this传入。在全局下,就是window,其他时候就是相应的object。总结来说,谁使用函数,this就是谁的,没人使用函数时,严格模式下,this指向undefined,非严格模式下this指向Window。
7.参考文献
参考一:全方位解读this
参考二:JavaScript中的this用法与指向
8、更多讨论
鸣谢
感谢大家观看
BY : 王帅
今天完成的事情:
用JS原生的方法完成了任务5
制作小课堂PTT
修改任务4中bug
明天计划的事情
用JQ完成一遍任务5
开始angular学习
遇到的问题:
1.制作PPT遇到了一个闭包的案例,因为目前还不了解闭包,这个地方知识点先留一下。
foo:"bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
(function (){
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
})();
}
};
myObject.func();
2. 下面的代码,我是先将response的返回结果作为text,然后经过JSON转换的,response的type类型可以直接将返回的文件作为JSON格式,但是不知道如何规定response的type,才能直接转成JSON?
var xhr = new XMLHttpRequest();
xhr.open("post","/carrots-admin-ajax/a/login",true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xhr.send("name="+name+"&pwd="+p);
xhr.onreadystatechange = doResult;
function doResult(){
if(xhr.readyState === 4 && xhr.status === 200){
var data =xhr.responseText;
tickle = JSON.parse(data);
warn.innerHTML = tickle.message;
console.log(warn.innerHTML);
}
}
收获: 学习了JS中this的指向。
评论