this的指向问题

  • 一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window。
function a(){
console.log(this); //输出函数a中的this对象
}
function b(){};
var c={name:"call"}; //定义对象c
var c = {
getFunc:function(){
return function(){
console.log(this)
}
}
}
var cFun = c.getFunc();
cFun()//Window 这是因为在全局环境下执行的函数
  • 在call和apply函数中this指向的是指定的对象,如果指定的对象为undefined或者null,那this对象指向window,如果指定的对象为空this也是指向的window,如果指向的对象是字符串,那this指向的就是String
var d = {
getThis:function(){
console.log(this)
}
}
var e = {
name:'e'//(给e写个`name`属性只是因为觉得孤零零的太难看了~~)
}
d.getThis.call(e); //这句话就相当于说把对象d中的上下文环境换成了对象e
d.getThis.call(66); //Number
d.getThis.call('wan'); //String
d.getThis.call(); //Window
d.getThis.call(true); //Boolean
  • 如果在箭头函数中,this对象等同于外层代码中的this
var f = {
getThis: ()=>{
console.log(this)
},
getThis2: function(){
console.log(this);
}
}
f.getThis(); //Window
f.getThis2(); //f

call、apply、bind的区别

  • call的基本用法

    • 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
    • 定义:调用一个对象的一个方法,以另一个对象替换当前对象。
    • call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
    • thisObj的取值有以下4种情况:
      • 不传,或者传null,undefined, 函数中的this指向window对象
      • 传递另一个函数的函数名,函数中的this指向这个函数的引用
      • 传递字符串、数值或布尔类型等基础类型,函数中的this指向其对应的包装对象,如 String、Number、Boolean
      • 传递一个对象,函数中的this指向这个对象
function a(){
console.log(this); //输出函数a中的this对象
}
function b(){}
var c={name:"call"}; //定义对象c
a.call(); //window
a.call(null); //window
a.call(undefined); //window
a.call(1); //Number
a.call(''); //String
a.call(true); //Boolean
a.call(b); //function b(){}
a.call(c); //Object
  • apply的基本用法

    • 语法:**apply([thisObj[,argArray]]) **
    • 定义:应用某一对象的一个方法,用另一个对象替换当前对象。
    • 如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

      如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
function class1(args1,args2){
this.name=function(){
console.log(args,args);
}
}
function class2(){
var args1="1";
var args2="2";
class1.call(this,args1,args2);
/*或*/
class1.apply(this,[args1,args2]);
}
var c=new class2();
c.name(); //1,2
  • bind的基本用法

    • bind是在EcmaScript5中扩展的方法(IE6,7,8不支持)
    • bind() 方法与 apply 和 call 很相似,也是可以改变函数体内 this 的指向。
    • bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数
      var bar = function(){
    console.log(this.x);
    }
    var foo = {
    x:3
    }
    bar(); // undefined
    var func = bar.bind(foo);
    func(); // 3
  • call、apply、bind三者的区别
    • 三者都是来改变函数的this对象的指向的
    • 三者的第一个参数都是this要指向的对象,也就是要指定的上下文
    • 三者都可以利用后续参数传参
    • bind是返回对应函数,便于稍后调用,call、apply是立即调用
    • call和apply作用是完全一样的,只是接收参数的方式不一样,call需要把参数按顺序传递进去,而apply则是把参数放在数组里。
      var obj = {
    x: 81,
    };
    var foo = {
    getX: function() {
    return this.x;
    }
    }
    console.log(foo.getX.bind(obj)()); //81
    console.log(foo.getX.call(obj)); //81
    console.log(foo.getX.apply(obj)); //81
    三个输出的都是81,但是注意看使用 bind() 方法的,他后面多了对括号。

参考文章:https://www.cnblogs.com/libin-1/p/6069031.html

JS 中的this指向问题和call、apply、bind的区别的更多相关文章

  1. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  2. 理解js中this的指向

         学习自原文  http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...

  3. js中this的指向

    在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...

  4. JS中的this 指向问题

    我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...

  5. 轻松了解JS中this的指向

    JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向 ...

  6. js中 this 的指向

    js中 this的指向一共存在3种地方: 1.全局的this; 2.构造函数的this; 3.call/apply; 一.全局的this: function test(){ this.d = 3;// ...

  7. js中的new操作符与Object.create()的作用与区别

    js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...

  8. 彻底理解js中this的指向,不必硬背。

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  9. 了解学习JS中this的指向

    [转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...

  10. JS中this的指向问题

    JS中this的定义:this对象是在运行时基于函数的执行环境绑定的(通俗点来说就是:this代表当前函数属于哪个对象). this一般情况下都代表的是global对象,在浏览器中就是window对象 ...

随机推荐

  1. OS.path部分函数的介绍

    OS.path模块中的部分函数的介绍 os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix( ...

  2. MySQL大小写敏感问题和命名规范

    注:本文大部内容参考自互联网相关文章 1.MySQL大小写敏感规则 MySQL中,一个库会对应一个文件夹,库里的表会则以文件的方式存放在文件夹内,所以,操作系统对大小写的敏感性决定了数据库和表的大小写 ...

  3. jq传统火车轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 接口测试——Java + TestNG 国家气象局接口(json解析)实例

    后端测试,主要以测试接口为主.需要代码支撑,近期便找了个天气接口捣鼓了. 使用到的工具是:Eclipse + TestNG + Maven + ReportNG,全国城市编码:http://www.c ...

  5. 【JavaScript运算符与表达式】

    一.表达式 1.原始表达式:2.14,"test",true/false,null--复合表达式:10*20-- 2.数组.对象的初始化表达式:new Array(1,2),[1, ...

  6. 我的第六个网页制作:table标签

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. HDU2689-Sort it-冒泡排序

    Sort it Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. Codeforces780C

    题解:n个气球 从1到n染色,如果a.b和c是不同的正方形,a和b在它们之间有一条直接的路径,b和c之间有一条直接的路径,然后在这三个方块上的气球颜色是不同的. AC代码 #include <s ...

  9. 三维dp&codeforce 369_2_C

    三维dp&codeforce 369_2_C 标签: dp codeforce 369_2_C 题意: 一排树,初始的时候有的有颜色,有的没有颜色,现在给没有颜色的树染色,给出n课树,用m种燃 ...

  10. c语言中标识符的作用域

    1.代码块作用域(block scope) 位于一对花括号之间的所有语句称为一个代码块,在代码块的开始位置声明的标识符具有代码块作用域,表示它们可以被这个代码中的所有语句访问.函数定义的形式参数在函数 ...