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 相关文章推荐
javascript实现控制的多级下拉菜单
Jul 05 Javascript
javascript 实现动态侧边栏实例详解
Nov 11 Javascript
基于Vue实例生命周期(全面解析)
Aug 16 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
Sep 20 jQuery
解决betterScroll在vue中存在图片时,出现拉不动的问题
Sep 27 Javascript
nodemon实现Typescript项目热更新的示例代码
Nov 19 Javascript
vue项目中使用vue-layer弹框插件的方法
Mar 11 Javascript
js最全的数组的降维5种办法(小结)
Apr 28 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
微信小程序canvas动态时钟
Oct 22 Javascript
vue配置型表格基于el-table拓展之table-plus组件
Apr 12 Vue.js
关于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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
跟我学Laravel之配置Laravel
2014/10/15 PHP
Laravel中log无法写入问题的解决
2017/06/17 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
jquery中获取id值方法小结
2013/09/22 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
2015/11/16 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
简单实现JavaScript弹幕效果
2020/08/27 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
在Django中创建动态视图的教程
2015/07/15 Python
python 全文检索引擎详解
2017/04/25 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
一套C#面试题
2013/10/09 面试题
工作个人的自我评价
2014/01/14 职场文书
《地震中的父与子》教学反思
2014/04/10 职场文书
大型活动组织方案
2014/05/10 职场文书
项目经理任命书
2014/06/04 职场文书
违反交通法规检讨书
2014/09/10 职场文书
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
2021/05/21 Python
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL