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 相关文章推荐
js操作iframe父子窗体示例
May 22 Javascript
javascript 事件处理示例分享
Dec 31 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
Aug 24 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
Sep 02 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
javascript新闻跑马灯实例代码
Jul 29 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
May 24 Javascript
vue高德地图之玩转周边
Jun 16 Javascript
解决layui页面按钮点击无反应,也不报错的问题
Sep 29 Javascript
vue 实现websocket发送消息并实时接收消息
Dec 09 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
JavaScript中layim之整合右键菜单的示例代码
Feb 06 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
xajax写的留言本
2006/11/25 PHP
php下通过POST还是GET来传值
2008/06/05 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
use jscript with List Proxy Server Information
2007/06/11 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
JavaScript setTimeout使用闭包功能实现定时打印数值
2015/12/18 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
JS实现动态修改table及合并单元格的方法示例
2017/02/20 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
python-numpy-指数分布实例详解
2019/12/07 Python
python的数学算法函数及公式用法
2020/11/18 Python
python 基于wx实现音乐播放
2020/11/24 Python
突袭HTML5之Javascript API扩展5—其他扩展(应用缓存/服务端消息/桌面通知)
2013/01/31 HTML / CSS
汽车维修专业个人求职信范文
2014/01/01 职场文书
学校教师安全责任书
2014/07/23 职场文书
会议接待欢迎标语
2014/10/08 职场文书
年终工作总结范文2014
2014/11/27 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
小学作文之描写天气
2019/08/15 职场文书