JavaScript调用模式与this关键字绑定的关系


Posted in Javascript onApril 21, 2018

Invocation 调用

调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。

实参与形参不一致不会导致运行时错误,多的被忽略,少的补为undefined

每个方法都会收到两个附加参数:this和arguments。this的值取决于调用的模式,调用模式:方法,函数,构造器和apply调用模式
this被赋值发生在被调用的时刻。不同的调用模式可以用call方法实现

var myObject = { 
value: 0, 
increment: function (inc) { 
this.value += typeof inc === 'number' ? inc : 1; 
} 
}; 
myObject.double = function(){ 
var helper = function(){ 
console.log(this);// this point to window 
} 
console.log(this);// this point to object myObject 
helper(); 
} 
myObject.double();//myObject Window

1 The Method Invocation Pattern 方法调用模式

方法:函数被保存为对象的属性.当方法被调用时,this被绑定到该对象

公共方法:通过this取得他们所属对象的上下文的方法

myObject.increment(); 
document.writeln(myObject.value); //

底层实现: myObject.increment。call(myObject,0);

2 The Function Invocation Pattern 函数调用模式

当函数并非对象的属性时就被当作函数调用(有点废话。。),this被绑定到全局对象(window)

ECMAScript5中新增strict mode, 在这种模式中,为了尽早的暴露出问题,方便调试。this被绑定为undefined

var add = function (a,b) { return a + b;}; 
var sum = add(3,4);// sum的值为7

底层实现:add.call(window,3,4)

strict mode:add.call(undefined,3,4)

方法调用模式和函数调用模式的区别

function hello(thing) { 
console.log(this + " says hello " + thing); 
} 
person = { name: "Brendan Eich" } 
person.hello = hello; 
person.hello("world") // [object Object] says hello world 等价于 person。hello。call(person,“world”) 
hello("world") // "[object DOMWindow]world" 等价于 hello。call(window,“world”)

3 The Constructor Invocation Pattern

JavaScript是基于原型继承的语言,同时提供了一套基于类的语言的对象构建语法。

this指向new返回的对象

var Quo = function (string) { 
this.status = string; 
}; 
Quo.prototype.get_status = function ( ) { 
return this.status; 
}; 
var myQuo = new Quo("this is new quo"); //new容易漏写,有更优替换 
myQuo.get_status( );// this is new quo

4 The Apply Invocation Pattern

apply和call是javascript的内置参数,都是立刻将this绑定到函数,前者参数是数组,后者要一个个的传递apply也是由call底层实现的

apply(this,arguments[]); 
call(this,arg1,arg2...); 
var person = { 
name: "James Smith", 
hello: function(thing,thing2) { 
console.log(this.name + " says hello " + thing + thing2); 
} 
} 
person.hello.call({ name: "Jim Smith" },"world","!"); // output: "Jim Smith says hello world!" 
var args = ["world","!"]; 
person.hello.apply({ name: "Jim Smith" },args); // output: "Jim Smith says hello world!"

相对的,bind函数将绑定this到函数和调用函数分离开来,使得函数可以在一个特定的上下文中调用,尤其是事件bind的apply实现

Function.prototype.bind = function(ctx){ 
var fn = this; //fn是绑定的function 
return function(){ 
fn.apply(ctx, arguments); 
}; 
}; 
bind用于事件中 
function MyObject(element) { 
this.elm = element; 
element.addEventListener('click', this.onClick.bind(this), false); 
}; 
//this对象指向的是MyObject的实例 
MyObject.prototype.onClick = function(e) { 
var t=this; //do something with [t]... 
};

总结

以上所述是小编给大家介绍的JavaScript调用模式与this关键字绑定的关系 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
一个无限级XML绑定跨框架菜单(For IE)
Jan 27 Javascript
jQuery 翻牌或百叶窗效果(内容三秒自动切换)
Jun 14 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
Dec 09 Javascript
Angularjs过滤器使用详解
May 25 Javascript
vuejs父子组件通信的问题
Jan 11 Javascript
Vue声明式渲染详解
May 17 Javascript
JavaScript使用闭包模仿块级作用域操作示例
Jan 21 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
Mar 25 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
OpenLayer学习之自定义测量控件
Sep 28 Javascript
vue+vant实现购物车全选和反选功能
Nov 17 Vue.js
微信小程序实现录音Record功能
May 09 Javascript
关于jquery layui弹出层的使用方法
Apr 21 #jQuery
jQuery中的for循环var与let的区别
Apr 21 #jQuery
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
Apr 21 #Javascript
JS实现字符串去重及数组去重的方法示例
Apr 21 #Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 #Javascript
vue源码解析之事件机制原理
Apr 21 #Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 #Javascript
You might like
php使用codebase生成随机数
2014/03/25 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
javascript设计模式 ? 备忘录模式原理与用法实例分析
2020/04/21 Javascript
[01:11]辉夜杯战队访谈宣传片—CDEC.Y
2015/12/26 DOTA
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
Python描述器descriptor详解
2015/02/03 Python
Python中基本的日期时间处理的学习教程
2015/10/16 Python
Django权限机制实现代码详解
2018/02/05 Python
Python多层装饰器用法实例分析
2018/02/09 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
读取nii或nii.gz文件中的信息即输出图像操作
2020/07/01 Python
华为C++笔试题
2014/08/05 面试题
人力资源管理专业自荐书范文
2014/02/10 职场文书
超市开店计划书
2014/04/26 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书