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 相关文章推荐
eval与window.eval的差别分析
Mar 17 Javascript
jquery ui resize 中border-box的bug修正
Apr 26 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
Dec 12 Javascript
基于vue2.0+vuex+localStorage开发的本地记事本示例
Feb 28 Javascript
Bootstrap模态框(Modal)实现过渡效果
Mar 17 Javascript
详解angular element()方法使用
Apr 08 Javascript
基于JavaScript实现的插入排序算法分析
Apr 14 Javascript
详解VueJS应用中管理用户权限
Feb 02 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
Jun 24 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
Aug 24 Javascript
jstree中的checkbox默认选中和隐藏示例代码
Dec 29 Javascript
JS面向对象编程实现的拖拽功能案例详解
Mar 03 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 substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
十个PHP高级应用技巧果断收藏
2015/09/25 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
CL vs ForZe BO5 第四场 2.13
2021/03/10 DOTA
广告显示判断
2006/08/31 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
70+漂亮且极具亲和力的导航菜单设计国外网站推荐
2011/09/20 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
JS画线(实例代码)
2013/11/20 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
js模糊查询实例分享
2016/12/26 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
vue2.0中goods选购栏滚动算法的实现代码
2017/05/17 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
Bootstrap Table使用整理(一)
2017/06/09 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
python中使用百度音乐搜索的api下载指定歌曲的lrc歌词
2014/07/18 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
服务口号大全
2014/06/11 职场文书
股东授权委托书范本
2014/09/13 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
2014年统计工作总结
2014/11/21 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
Java练习之潜艇小游戏的实现
2022/03/16 Java/Android