JS绑定种类汇总
这里是《你不知道的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绑定种类汇总的更多相关文章
- cxx-generator JS绑定工具
第一部分:配置安装环境 cxx-generator是由Zynga工程师贡献的C++代码绑定到js工具.用于将cocos2d-x 的c++代码,生成相应的js绑定代码(由c++写成),然后将这些函数注册 ...
- 数据可视化的优秀入门书籍有哪些,D3.js 学习资源汇总
习·D3.js 学习资源汇总 除了D3.js自身以外,许多可视化工具包都是基于D3开发的,所以对D3的学习就显得很重要了,当然如果已经有了Javascript的经验,学起来也会不费力些. Github ...
- cocos2dx手写js绑定C++
这两天连续查阅了js绑定c++的非常多文章 , 有手动与自己主动两种方式 . 本来想用自己主动绑定的 , 可是NDK一直下载不下来.....就给算了 . 以下总结一下手动绑定的实现过程 : 一共三步 ...
- 原生js绑定和解绑事件,兼容IE,FF,chrome
主要是最近项目中用到了原生的js 解绑和绑定 事件 然后今天研究了一下,其实问题不大,不过要注意不要把单词写错了,今天我就找了好久单词写错了. 需求:当鼠标移上去以后,给Select加载元素,接着解 ...
- Cocos2d-x使用Javascript开发js绑定C++<代码演示样例>
class IOSiAPDelegate{ public: virtual ~IOSiAPDelegate() {} }; class IOSAlipay{ public: IOSAlipay(); ...
- 基于vue项目的js工具方法汇总
以下是个人过去一年在vue项目的开发过程中经常会用到的一些公共方法,在此进行汇总,方便以后及有需要的朋友查看~ let util = {}; /** * @description 日期格式化 * @p ...
- js常用功能汇总
var Utils = function() { this.Tools; this.ui; }; Utils = new Utils(); Utils.prototype.Tools = { year ...
- js绑定下拉框
---恢复内容开始--- 方法一 js-ajax部分 function GetDListOfCt() { $.ajax({ url: "../../Ajax/Boss_Show.ashx?t ...
- JS 常用库汇总收集
本文不定期更新, 用于汇总记录一些看着 ok 的 JS 库. 库名 简介 项目地址 macy.js 仅 4 kb的 原生 流布局插件 http://macyjs.com/ Driver.js 仅 4 ...
随机推荐
- 1583: [Usaco2009 Mar]Moon Mooing 哞哞叫
1583: [Usaco2009 Mar]Moon Mooing 哞哞叫 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 244 Solved: 126 ...
- 1613: [Usaco2007 Jan]Running贝茜的晨练计划
1613: [Usaco2007 Jan]Running贝茜的晨练计划 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1252 Solved: 609 ...
- ubuntu Error mounting /dev/sda6 at /media/xxx...
问题原因:可能是windows没有完全关机,详细请看我的另一博文: http://www.cnblogs.com/ediszhao/p/3794459.html 为了学习linux我装了双系统,因为我 ...
- 元素类型为 "package" 的内容必须匹配 "(result-types?,interceptors?,default-interceptor-ref?
该错误为struts.xml内配置文件节点顺序错误. package内的元素节点必须按照以下顺序排放: result-types interceptors defau ...
- Android权限解释
属性 说明 android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改 ...
- SQL Server跨数据库 增删查改
比如你在库A ,想查询库B的表.可以用 数据库名.架构名.表名的方式查询 select * from 数据库B.dbo.表1 也可以在存储过程中这样使用. 需要注意的是,如果使用这样的查询方式,你必须 ...
- .net平台的MongoDB使用
前言 最近花了点时间玩了下MongoDB.Driver,进行封装了工具库,平常也会经常用到MongoDB,因此写一篇文章梳理知识同时把自己的成果分享给大家. 本篇会设计到Lambda表达式的解析,有兴 ...
- JDBC连接数据以及操作数据
好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...
- Python学习笔记之基本语法学习1
★学习目标: 用Python做HTTP接口测试 ★学习的大纲: ●Python语言基础(安装,第一个案例,基本语法等) ●Request模块使用 ●编写一个简单功能的接口测试案例 ●HTTP协议基础 ...
- 20155304 2016-2017-2 《Java程序设计》第五周学习总结
20155304 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 try catch JVM会先尝试执行try区块中的内容,若发生错误且与catch后 ...