javaScript中的this示例学习详解及工作原理


Posted in Javascript onJanuary 13, 2014

this的工作原理

如果一个函数被作为一个对象的方法调用,那么this将被指派为这个对象。

var parent = {
    method: function () {
        console.log(this);
    }
};parent.method();
// <- parent

注意这种行为非常“脆弱”,如果你获取一个方法的引用并且调用,那么this的值不会是parent了,而是window全局对象。这让大多数开发者迷惑。

ThisClownCar();
// <- Window
 

改动this

.call、 .apply 和.bind 方法用来操作调用函数的方式,帮我们定义this的值和传递给函数的参数值。

Function.prototype.call 可以有任意数量的参数,第一个参数被分配给this,剩下的被传递给调用函数。

Array.prototype.slice.call([1, 2, 3], 1, 2)
// <- [2]Function.prototype.apply 的行为和.call类似,但它传递给函数的参数是一个数组,而不是任意参数。
String.prototype.split.apply('13.12.02', ['.'])
// <- ['13', '12', '02']
 

Function.prototype.bind 创建一个特殊的函数,该函数将永远使用传递给.bind的参数作为this的值,以及能够分配部分参数,创建原函数的珂里化(curride)版本。

 

var arr = [1, 2];
var add = Array.prototype.push.bind(arr, 3);// effectively the same as arr.push(3)
add();
// effectively the same as arr.push(3, 4)
add(4);
console.log(arr);
// <- [1, 2, 3, 3, 4]

作用域链中的this

在下面的例子,this将无法在作用域链中保持不变。这是规则的缺陷,并且常常会给业余开发者带来困惑。

function scoping () {
  console.log(this);  return function () {
    console.log(this);
  };
}
scoping()();
// <- Window
// <- Window

有一个常见的方法,创建一个局部变量保持对this的引用,并且在子作用域中不能有同命变量。子作用域中的同名变量将覆盖父作用域中对this的引用。http://www.cnblogs.com/sosoft/

function retaining () {
  var self = this;  return function () {
    console.log(self);
  };
}
retaining()();
// <- Window
 

除非你真的想同时使用父作用域的this,以及当前this值,由于某些莫名其妙的原因,我更喜欢是使用的方法.bind函数。这可以用来将父作用域的this指定给子作用域。

 

function bound () {
  return function () {
    console.log(this);
  }.bind(this);
}bound()();
// <- Window
Javascript 相关文章推荐
ajax无刷新动态调用股票信息(改良版)
Nov 01 Javascript
js实现页面跳转的五种方法推荐
Mar 10 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
Aug 05 Javascript
D3.js实现直方图的方法详解
Sep 25 Javascript
JS实现探测网站链接的方法【测试可用】
Nov 08 Javascript
详解Vue中添加过渡效果
Mar 20 Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 Javascript
angular.extend方法的具体使用
Sep 14 Javascript
node thread.sleep实现示例
Jun 20 Javascript
angular6.0开发教程之如何安装angular6.0框架
Jun 29 Javascript
vue 微信分享回调iOS和安卓回调出现错误的解决
Sep 07 Javascript
express异步函数异常捕获示例详解
Nov 30 Javascript
JS 日期比较大小的简单实例
Jan 13 #Javascript
JS之Date对象和获取系统当前时间详解
Jan 13 #Javascript
JS OffsetParent属性深入解析
Jan 13 #Javascript
JavaScript网页定位详解
Jan 13 #Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 #Javascript
ie8本地图片上传预览示例代码
Jan 12 #Javascript
js 立即调用的函数表达式如何写
Jan 12 #Javascript
You might like
PHP解码unicode编码的中文字符代码分享
2014/08/13 PHP
PHP解析RSS的方法
2015/03/05 PHP
JavaScript Date对象使用总结
2009/05/14 Javascript
jQuery结合PHP+MySQL实现二级联动下拉列表[实例]
2011/11/15 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python反转序列的方法实例分析
2018/03/21 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
Python列表推导式实现代码实例
2020/09/09 Python
同事吵架检讨书
2014/02/05 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
学生个人自我鉴定范文
2014/03/28 职场文书
求职信格式要求
2014/05/23 职场文书
无房证明范本
2014/09/17 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书