这里是《你不知道的JS》中常见的this绑定种类分享:

1)默认绑定:

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

解析:foo()是直接使用不带任何修饰的函数引用进行调用的,因此只能使用默认绑定this指向全局对象

注意:严格模式下与foo()的调用位置无关:引擎会抛出TypeError: this is undefined的异常

2)隐式绑定:

function foo(){
console.log(this.a);
}
var obj = {
a:2,
foo:foo
};
obj.foo();//

解析:在这里 foo() 被调用时,落脚点确实指向obj对象,当函数引用有上下文对象时,隐式绑定规则会将函数调用中的this绑定到这个上下文对象,即this.a和obj.a是一样的

注意:对象属性引用链中只有最顶层或者说最后一层影响调用位置

function foo(){
console.log(this.a);
}
var obj2 = {
a:42,
foo:foo
};
var obj1 = {
a:2,
obj2:obj2
};
obj1.obj2.foo();//

3)显式绑定:

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

解析:call() 方法会将第一个参数绑定到this,在调用函数时指定这个this,上面示例即在调用foo时强制把他的this绑定到obj上

注意:显式绑定仍然无法解决丢失绑定问题

4)硬绑定:

function foo(){
console.log(this.a);
}
var obj = {
a:2
};
var bar = function(){
foo.call(obj);
};
bar();//
setTimeout(bar,100);//
//硬绑定的bar不可能再修改它的this
bar.call(window);//

解析:在将foo的this强制绑定到obj后无论之后如何调用bar,都会在obj上调用foo

注意:硬绑定典型应用场景:创建一个包裹函数,传入所有的参数并返回接收到的所有值

function foo(something){
console.log(this.a,something);//2 3
return this.a+something;
}
var obj = {
a:2
};
var bar = function(){
return foo.apply(obj,arguments);
};
var b = bar(3);
console.log(b);//

由于硬绑定函数是一种非常常用的模式,所以在ES5中提供到了内置的方法:Function.prototype.bind

function foo(something){
console.log(this.a,something);//2 3
return this.a+something;
}
var obj = {
a:2
};
var bar = foo.bind(obj);
var b = bar(3);
console.log(b);//

注意:bind(...)会返回一个硬编码的新函数,它会把参数设置为this的上下文并调用原始函数

5)new绑定:JS中的new的机制实际上和其他面向类的语言完全不同,JS中"构造函数"是一些使用new操作符时被调用的函数

使用new调用函数,或者说发生构造函数调用时,会执行下面的操作:

#创建(构造)一个全新的对象
#这个新对象会被执行 [[原型]]连接
#这个新对象会绑定到函数调用的this
#如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象

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

解析:使用new来调用 foo(...) 时,会构造一个新对象并把它绑定到 foo(...)调用中的this上

最后要说的是这几种绑定的优先级:

new绑定>显式绑定>隐式绑定>默认绑定

JS绑定种类汇总的更多相关文章

  1. cxx-generator JS绑定工具

    第一部分:配置安装环境 cxx-generator是由Zynga工程师贡献的C++代码绑定到js工具.用于将cocos2d-x 的c++代码,生成相应的js绑定代码(由c++写成),然后将这些函数注册 ...

  2. 数据可视化的优秀入门书籍有哪些,D3.js 学习资源汇总

    习·D3.js 学习资源汇总 除了D3.js自身以外,许多可视化工具包都是基于D3开发的,所以对D3的学习就显得很重要了,当然如果已经有了Javascript的经验,学起来也会不费力些. Github ...

  3. cocos2dx手写js绑定C++

    这两天连续查阅了js绑定c++的非常多文章  , 有手动与自己主动两种方式 . 本来想用自己主动绑定的 , 可是NDK一直下载不下来.....就给算了 . 以下总结一下手动绑定的实现过程 : 一共三步 ...

  4. 原生js绑定和解绑事件,兼容IE,FF,chrome

    主要是最近项目中用到了原生的js 解绑和绑定 事件  然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解 ...

  5. Cocos2d-x使用Javascript开发js绑定C++<代码演示样例>

    class IOSiAPDelegate{ public: virtual ~IOSiAPDelegate() {} }; class IOSAlipay{ public: IOSAlipay(); ...

  6. 基于vue项目的js工具方法汇总

    以下是个人过去一年在vue项目的开发过程中经常会用到的一些公共方法,在此进行汇总,方便以后及有需要的朋友查看~ let util = {}; /** * @description 日期格式化 * @p ...

  7. js常用功能汇总

    var Utils = function() { this.Tools; this.ui; }; Utils = new Utils(); Utils.prototype.Tools = { year ...

  8. js绑定下拉框

    ---恢复内容开始--- 方法一 js-ajax部分 function GetDListOfCt() { $.ajax({ url: "../../Ajax/Boss_Show.ashx?t ...

  9. JS 常用库汇总收集

    本文不定期更新, 用于汇总记录一些看着 ok 的 JS 库. 库名 简介 项目地址 macy.js 仅 4 kb的 原生 流布局插件 http://macyjs.com/ Driver.js 仅 4 ...

随机推荐

  1. Matlab自带常用的分类器,直接复制用就好了,很方面。

    很方面的,懒得自己写了. clc   clear all     load('wdtFeature');         %   训练样本:train_data             % 矩阵,每行 ...

  2. 【Javascript】搞定JS面试——跨域问题

    什么是跨域? 为什么不能跨域? 跨域的解决方案都有哪些(解决方法/适用场景/get还是post)?  一.什么是跨域?       只要协议.域名.端口有任何一个不同,就是跨域.           ...

  3. java-信息安全(四)-数据签名、数字证书

    概述 信息安全基本概念: 数字签名 数字证书 数字签名 数字签名(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名 ...

  4. 基于AGS JS开发自定义贴图图层

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 假设一个景区有多张图片需要在地图上展示,并且随着地图的缩放而缩 ...

  5. ASP.NET Core MVC 源码学习:Routing 路由

    前言 最近打算抽时间看一下 ASP.NET Core MVC 的源码,特此把自己学习到的内容记录下来,也算是做个笔记吧. 路由作为 MVC 的基本部分,所以在学习 MVC 的其他源码之前还是先学习一下 ...

  6. Windows7 java-jdk1.7安装及设置变量过程

    jdk安装的次数较少,容易忘记,这里专门记录一下. 1:jdk1.7网上到处都是可以随便下载一个.然后进行安装,不过在安装过程中把安装路径单独记忆一下,在配置变量的时候会用到. 2:安装完JDK后配置 ...

  7. BootStrap入门教程 (二)

    文本转自 http://www.cnblogs.com/ventlam/archive/2012/05/29/2520807.html 上讲回顾:Bootstrap的手脚架(Scaffolding)提 ...

  8. Ubuntu14.04下搜狗输入法的安装及配置

    在搜狗官网上下载相应的版本32/64 搜狗网址:http://pinyin.sogou.com/linux/?r=pinyin 在文件夹中找到下载的搜狗输入法文件(默认位置是Downloads),双击 ...

  9. sql 两种分页offset和row_number简单分析

    新建临时表字段id,向临时表里插入1,2,3,4,5,6 if object_id('tempdb..#test') is not null drop table #test create table ...

  10. JS中new的自定义实现创建实例对象

    我们都知道在JS中通常通过对象字面量和new关键字来创建对象,那么今天我就来给大家讲讲new是怎么创建实例对象的:首先创建一个构造函数: function Person(name,age){ this ...