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 相关文章推荐
jquery监控数据是否变化(修正版)
Apr 12 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
将json当数据库一样操作的javascript lib
Oct 28 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
使用jQuery实现星级评分代码分享
Dec 09 Javascript
基于jQuery实现网页进度显示插件
Mar 04 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
May 19 Javascript
JavaScript中string对象
Jun 12 Javascript
jQury Ajax使用Token验证身份实例代码
Sep 22 Javascript
vue中如何让子组件修改父组件数据
Jun 14 Javascript
Vue.js watch监视属性知识点总结
Nov 11 Javascript
Vue单文件组件开发实现过程详解
Jul 30 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与XML、XSLT、Mysql的结合运用实现代码
2009/11/19 PHP
PHP $_FILES函数详解
2011/03/09 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JS应用正则表达式转换大小写示例
2014/09/18 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
Jquery基础教程之DOM操作
2015/08/19 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
Python群发邮件实例代码
2014/01/03 Python
python对数组进行反转的方法
2015/05/20 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
python处理写入数据代码讲解
2020/10/22 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
*p++ 自增p 还是p所指向的变量
2016/07/16 面试题
用Python写一个for循环的例子
2016/07/19 面试题
关于赌博的检讨书
2014/01/08 职场文书
入党积极分子自我鉴定
2014/02/18 职场文书
担保书格式及范文
2014/04/01 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
年会主持人开场白台词
2015/05/29 职场文书
Python中的min及返回最小值索引的操作
2021/05/10 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
浅谈怎么给Python添加类型标注
2021/06/08 Python
Python机器学习应用之工业蒸汽数据分析篇详解
2022/01/18 Python