理解JavaScript中的this关键字
JavaScript中this关键字理解
在爬虫的过程中遇到了前端的js代码,对于this关键字理解的不是很清楚,所以写下这篇笔记,不足之处,希望得以改之。
this的指向在函数定义的时候无法确定,只有在函数执行的时候确定this的指向
这句话其实有部分干扰性,具体最后在进行总结this关键字的理解
demo01
function printName(){
var userName = "追梦者";
console.log(this.userName); // undefined
console.log(this); // wimdow
}
printName();
说明:可以看到当调用func函数的时候,发现出现了undefined和window本身,可以这样说:这个printName的函数实际是被window对象所点出来的
function printName(){
var userName = "追梦者";
console.log(this.userName); // undefined
console.log(this); // window
}
window.printName();
可以发现调用这个函数的本身就是我们的 window对象,所以这里的this关键字所指的就是window 。所以第一个则未被定义,第二个就是window本身。
userName = "梦想实现者";
function printName(){
var userName = "追梦者";
console.log(this.userName); // 梦想实现者
console.log(this); // window
}
window.printName();
此时,this.userName调用的是window的属性值
demo02
var object = {
userName:"追梦者",
printName:function(){
console.log(this.userName); // 追梦者
}
};
object.printName();
这里的this关键字指向的对象是object, 调用是object进行调用的。
demo03
var object = {
userName:"追梦者",
printName:function(){
console.log(this.userName); // 追梦者
}
};
window.object.printName();
demo03和demo02中的案例是一样的,只是调用者不同,但是this指向的还是object对象。
说明:
window是JavaScript中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window.对象。
var object = {
numA:10,
funcB:{
numA:12,
printNum:function(){
console.log(this.numA); // 12
}
}
}
object.funcB.printNum();
这里使用object对象进行调用的,那么为什么没有输出的值是 10?
补充:
如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window
如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
所以在来看上面的一个案例,就会发现 此时的this指向就是funcB
var object = {
numA:10,
funcB:{
printNum:function(){
console.log(this.numA); // undefined
}
}
}
object.funcB.printNum();
为什么是undefined的?
在对象funcB中发现没有属性numA,这个this指向指的是对象funcB,所有出现了undefined。
demo04
var object = {
numA:10,
funcB:{
numA:12,
printNum:function(){
console.log(this.numA); // undefined
console.log(this);// window
}
}
}
var o = object.funcB.printNum;
o();
是不是有蒙圈了?
注意: 调用者是一个变量,虽然函数printNum是被对象funcB所引用,但是在将printNum赋值给变量o的时候并没有执行所以最终指向的是window
可以进行分析:
// 控制台进行输出:
window.o;
ƒ (){
console.log(this.numA); //
console.log(this);//
}
是不是发现这个 f 就是我们的 printNum 函数。
构造函数的this关键字
function Fn(){
this.userName = "追梦者";
}
var User = new Fn;
console.log(User.userName);
此时的this关键字指向的就是 User。对象User可以点出函数Fn里面的userName是因为new关键字可以改变this的指向,将这个this指向对象User,为什么我说User是对象,因为用了new关键字就是创建一个对象实例。
this遇到return的时候
function Fn(){
this.userName = "追梦者";
return {};
}
var User = new Fn;
console.log(User.userName); // undefined
function Fn(){
this.userName = "追梦者";
return function(){};
}
var User = new Fn;
console.log(User.userName); // undefined
function Fn(){
this.userName = "追梦者";
return 1;
}
var User = new Fn;
console.log(User.userName); // 追梦者
说明:如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。
补充说明
在严格版中的默认的this不再是window,而是undefined。
new操作符会改变函数this的指向问题,虽然我们上面讲解过了,但是并没有深入的讨论这个问题,网上也很少说,所以在这里有必要说一下。
function fn(){
this.num = 1;
}
var a = new fn();
console.log(a.num); // 1
为什么this会指向a?
new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。
理解JavaScript中的this关键字的更多相关文章
- 转载 深入理解JavaScript中的this关键字
转载原地址: http://www.cnblogs.com/rainman/archive/2009/05/03/1448392.html 深入理解JavaScript中的this关键字 1. 一 ...
- 如何理解JavaScript中的this关键字
前言 王福朋老师的 JavaScript原型和闭包系列 文章看了不下三遍了,最为一个初学者,每次看的时候都会有一种 "大彻大悟" 的感觉,而看完之后却总是一脸懵逼.原型与闭包 可以 ...
- 浅显易懂的理解JavaScript中的this关键字
在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余. 1. 一般用处 对 ...
- 正确理解JavaScript中的this关键字
JavaScript有this关键字,this跟JavaScript的执行上下文密切相关,很多前端开发工程师至今对this关键字还是模棱两可,本文将结合代码讲解下JavaScript的this关键字. ...
- 用自然语言的角度理解JavaScript中的this关键字
转自:http://blog.leapoahead.com/2015/08/31/understanding-js-this-keyword/ 在编写JavaScript应用的时候,我们经常会使用th ...
- 深入理解JavaScript中的this关键字
1. 一般用处 2. this.x 与 apply().call() 3. 无意义(诡异)的this用处 4. 事件监听函数中的this 5. 总结 在JavaScript中this变量是一个令人难以 ...
- 理解javascript中的with关键字
说起js中的with关键字,很多小伙伴们的第一印象可能就是with关键字的作用在于改变作用域,然后最关键的一点是不推荐使用with关键字.听到不推荐with关键字后,我们很多人都会忽略掉with关键字 ...
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- 深入理解javascript中的立即执行函数(function(){…})()
投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...
随机推荐
- 【阿里云IoT+YF3300】3. Alink物模型之属性上传和下发
[名词解释]属性:设备的功能模型之一,一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等.属性支持 GET 和 SET 请求方式.应用系统可发起对属性的读取和设置请求. 在上一篇文章& ...
- Spring框架入门之基于Java注解配置bean
Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...
- Leetcode Weekly Contest 152
退役老人现在连leetcode都不会做了 = = 今天早上做了leetcode第三题题目看错了,加上比赛中间还在调投稿的实验,一心二用直接gg 总结下教训就是 本渣现在做题连题目都看不清就开始做.开始 ...
- 从零开始搭建Java开发环境第一篇:Java工程师必备软件大合集
1.JDK https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 目前主流的JDK版 ...
- 【sybase】You can’t run SELECT INTO in this database的解决办法
进入master 数据库,使用sp_dboption test ,'select into',true命令(其中test为要设置可用的数据库)
- 1026-windy数+数位DP+记忆化搜索
1026: [SCOI2009]windy数 题意:数位DP模板题: 目前只理解了记忆化搜索,就想练练手, ------给递推写法留一个位子 ------ 注意这道题要判断前导0的情况,1 )可以加一 ...
- Codeforces 948D Perfect Security
Perfect Security 题意:给你一个A[i]数组, 再给你一个B[i]数组, 现在用选取 B[i] 数组中的一个 去和 A[i] 数组里的一个元素去进行异或操作, B[i]数组的元素只能用 ...
- Codeforces Technocup 2017 - Elimination Round 2 E Subordinates(贪心)
题目链接 http://codeforces.com/contest/729/problem/E 题意:给你n个人,主管id为s,然后给你n个id,每个id上对应一个数字表示比这个人大的有几个. 最后 ...
- Codeforces 734D. Anton and Chess(模拟)
Anton likes to play chess. Also, he likes to do programming. That is why he decided to write the pro ...
- dp递推题2010年吉林省省赛 1456: 逃票的chanming(3)
1456: 逃票的chanming(3) 时间限制: 2 Sec 内存限制: 128 MB提交: 326 解决: 48[提交][状态][讨论版] 题目描述 这是一个神奇的国度. 这个国度一 ...