博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于this的全面解析(下)
阅读量:5963 次
发布时间:2019-06-19

本文共 1352 字,大约阅读时间需要 4 分钟。

判断this

  1. 函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象。

  2. bar = new foo()

  3. 函数是否通过call、apply(显式绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象。

  4. bar = foo.call(obj2)

  5. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this绑定的是那个上下文对象。

  6. bar = obj1.foo()

  7. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。

  8. bar = foo();

绑定例外

被忽略的this

如果把null或者undefined作为this的绑定对象传入call、apply或者bind,这些值在调用时会被忽略,实际应用的是默认绑定规则。

function foo() {    console.log(this.a);    }    var a = 2;    foo.call(null); //2

然而,总是使用null来忽略this绑定可能产生一些副作用。如果某个函数确实使用了this,那默认绑定规则会把this绑定到全局对象(在浏览器中全局对象为window),这将导致不可预计的后果(比如修改全局对象)。

显而易见,这种方式可能会导致许多难以分析和追踪的bug。

更安全的this

一种“更安全”的做法是传入一个特殊的对象、把this绑定到这个对象不会对你的程序产生副作用。

在JavaScript中创建一个空对象最简单的方法都是Object.create(null),但是并不会创建Object.prototype这个委托。

function foo(a, b) {        console.log("a:" + a + ", b:" + b);    }    //创建一个新对象    var emptyObj = Object.create(null);    foo.apply(emptyObj, [2, 3])    var bar = foo.bind(emptyObj, 2);    bar(3);
间接引用

间接引用最容易在赋值时发生。

function foo() {        console.log(this.a);    }    var a = 2;    var o = {        a: 3,        foo: foo    };    var p = {        a: 4    };    o.foo(); //3    (p.foo = o.foo)() //2

赋值表达式p.foo= o.foo的返回值是目标函数的引用,因此调用位置是foo()而不是p.foo()或者o.foo(),所以绑定的是全局对象。

小结

如果要判断一个运行中函数的this绑定,就需要找到这个函数的直接调用位置。找到之后就可以顺序应用下面这四条规则来判断this的绑定对象。

  1. 由new调用?绑定到新创建的对象。

  2. 由call或者apply(或者bind)调用?绑定到指定的对象。

  3. 由上下文对象调用?绑定到那个上下文对象。

  4. 默认:在严格模式下绑定到undefined,否则绑定到全局对象。

转载地址:http://mwnax.baihongyu.com/

你可能感兴趣的文章
在澳大利亚为Mini团队实施Scrum2年总结
查看>>
HDU Problem 5395 Gym Class 【拓扑排序+优先队列】
查看>>
ExtJs combobox模糊匹配
查看>>
线程中断、线程让步、线程睡眠、线程合并
查看>>
Codeforces Round #532(Div. 2) A.Roman and Browser
查看>>
bupt summer training for 16 #4 ——数论
查看>>
【leetcode】145. Binary Tree Postorder Traversal
查看>>
[CodeForces - 296D]Greg and Graph(floyd)
查看>>
微信开发准备(四)--nat123内网地址公网映射实现
查看>>
EasyUI Calendar 日历
查看>>
26.Extjs 部门列表信息展示页面
查看>>
maven学习手记 - 3
查看>>
Window 命令行神器:cmder
查看>>
Oracle 索引
查看>>
数据库复习
查看>>
unix 环境高级编程
查看>>
为数据库建立索引
查看>>
第二周作业-软件工作量的估计
查看>>
我的wordpress插件总结
查看>>
MAXIMO 快速查找实现
查看>>