js中的this指向问题(小计)
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定,this最终指向调用它的对象。
1.函数调用模式
当一个函数并非一个对象的属性时,那么它就是被当做函数来调用的。在此种模式下,this被绑定为全局对象,在浏览器环境下就是window对象;
function fn(){
var a = "hello";
console.log(this.a); //undefined
console.log(this); //window
}
fn();
2.方法调用模式
当函数被保存为一个对象的属性时,它就可称为这个对象的方法。当一个方法被调用时,this被绑定到这个对象上。如果调用表达式包含一个提取属性的动作(. 或 []),那么它被称为方法调用
var obj = {
name : "hello",
sayName : function(){
console.log(this.name); //hello
}
}
obj.sayName();
这里的this指向的对象是obj,因为调用这个sayName()函数是通过obj.sayName()执行的。
var obj = {
name : "hello",
obj2 : {
name : "world",
sayName : function(){
console.log(this.name); //world
console.log(this); //obj2
}
}
}
obj.obj2.sayName();
因为是obj.obj2调用的这个函数,所以指向obj2这个对象。
var obj = {
name : "hello",
obj2 : {
//name : "world",
sayName : function(){
console.log(this.name); //undefined
console.log(this); //obj2
}
}
}
obj.obj2.sayName();
同理,因为是obj.obj2调用的这个函数,所以指向obj2这个对象。
var name = "我是最外面的name";
var obj = {
name : "hello",
obj2 : {
name : "world",
sayName : function(){
console.log(this.name); //"我是最外面的name"
console.log(this); //window
}
}
}
var q = obj.obj2.sayName;
q();
q是全局变量,在全局环境下执行,this指向window;
3.构造函数调用模式
如果在一个函数前面加上new关键字来调用,那么就会创建一个连接到该函数的prototype成员的新对象,同时,this会被绑定到这个新对象上。这种情况下,这个函数就可以成为此对象的构造函数。
function fn(){
console.log(this);//fn
}
var a = new fn();
在构造函数,new出一个对象时,this指向这个构造函数,new关键字会改变this的指向;
function fn(){
this.name = "hello";
}
var a = new fn();
console.log(a.name); //hello
当用new关键字,返回的是一个对象,this指向的就是那个返回的对象;
如果返回的不是对象,this还是指向函数的实例,虽然null属于对象,但是返回null依然指向函数实例;
function fn(){
this.name = "hello";
return {};
}
var a = new fn();
console.log(a.name); //undefined
function fn(){
this.name = "hello";
return function(){
};
}
var a = new fn;
console.log(a.name); //undefined
function fn(){
this.name = "hello";
return function(){
};
}
var a = new fn;
console.log(a.name); //undefined
function fn(){
this.name = "hello";
return [];
}
var a = new fn;
console.log(a.name); //undefined
function fn(){
this.name = "hello";
return 1;
}
var a = new fn;
console.log(a.name); //hello
function fn(){
this.name = "hello";
return 1;
}
var a = new fn;
console.log(a.name); //hello
function fn(){
this.name = "hello";
return null;
}
var a = new fn;
console.log(a.name); //hello
function fn(){
this.name = "hello";
return undefined;
}
var a = new fn;
console.log(a.name); //hello
4.apply和call调用模式
JS中,函数也是对象,所有函数对象都有两个方法:apply和call,这两个方法可以让我们构建一个参数数组传递给调用函数,也允许我们改变this的值
var name = "window";
var obj = {
name : 'obj'
}
function sayName(){
console.log(this.name);
}
sayName();//window
sayName.apply(obj);//obj
sayName.call(obj);//obj
sayName.apply();//window
sayName.call(); //window
在全局范围内,this指向全局对象(浏览器下指window对象)
对象函数调用时,this指向当前对象
全局函数调用时,应该是指向调用全局函数的对象。
使用new关键字实例化对象时,this指向新创建的对象
当用apply和call上下文调用的时候指向传入的第一个参数;
js中的this指向问题(小计)的更多相关文章
- 理解js中this的指向
学习自原文 http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- js中this的指向
在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...
- JS中的this 指向问题
我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...
- 轻松了解JS中this的指向
JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向 ...
- js中 this 的指向
js中 this的指向一共存在3种地方: 1.全局的this; 2.构造函数的this; 3.call/apply; 一.全局的this: function test(){ this.d = 3;// ...
- 彻底理解js中this的指向,不必硬背。
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- 了解学习JS中this的指向
[转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...
- 彻底理解js中this的指向
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
随机推荐
- 20175312 2018-2019-2 《Java程序设计》结对编程练习_四则运算(第一周:阶段性总结)
20175312 2018-2019-2 <Java程序设计>结对编程练习_四则运算(第一周:阶段性总结) 结对对象与其博客链接 20175309 刘雨恒:https://www.cnbl ...
- 初识Python,简单初学代码
第一个自己手写的代码~ If 与 Elif #!/usr/bin/env python # - * - coding:uft8 - * - Inp = input ( '请输入你的会员级别' ) if ...
- Server酱微信推送中的问题
1.写在URL的文字就是不在微信端显示 当时为了明显提示写了个这个:<--11111-->后来发现1111不能显示,去掉两边的<---->就可以了, 2.输出到微信端的文字不换 ...
- CSS(四)
css元素溢出 当子元素的尺寸超过父元素的尺寸时,需要设置父元素显示溢出的子元素的方式,设置的方法是通过overflow属性来设置. overflow的设置项: 1.visible 默认值.内容不会被 ...
- js面向对象关键点
函数加new 工作流程: (1) 创建一个新对象: => var this = new Object(); (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) : (3) ...
- Codechef August Challenge 2018 : Lonely Cycles
传送门 几波树形dp就行了. #include<cstdio> #include<cstring> #include<algorithm> #define MN 5 ...
- jQuery 心跳请求
原文链接:http://caibaojian.com/setinterval.html 前言:1.使用setInterval()的定时器会把事件运行的时间也包含在内,如果要精确算定时两个任务之间的时间 ...
- require和import区别
遵循的模块化规范不一样 模块化规范:即为 JavaScript 提供一种模块编写.模块依赖和模块运行的方案.谁让最初的 JavaScript 是那么的裸奔呢——全局变量就是它的模块化规范. requi ...
- 微信公众号_订阅号_access_token_创建菜单_菜单name+表情
全局唯一接口调用凭据 access_token 用于接口调用的一个必要参数 有了 access_token 就能实现所有的接口 特点: 1. 有效期为 2 小时,所以 2 小时要更新一次,提前 5 ...
- 传统方式和插件方式 分别实现 分页 功能 pageHelper 插件
实现分页 这里提供两种方式 一种是传统的分页方式 一种是基于pageHelper插件 实现的分类 推荐使用后者 前者是一般开发的方式 思路 先手动创建一个 pageUtil 工具 ...