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 相关文章推荐
js压缩利器
Feb 20 Javascript
JavaScript中的History历史对象
Jan 16 Javascript
js 加载时自动调整图片大小
May 28 Javascript
JavaScript中的类继承
Nov 25 Javascript
javascript针对DOM的应用分析(三)
Apr 15 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
Sep 11 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
Jun 06 Javascript
js数组实现权重概率分配
Sep 12 Javascript
vue-cli之router基本使用方法详解
Oct 17 Javascript
简单通过settimeout看javascript的运行机制
May 10 Javascript
了解JavaScript中let语句
May 30 Javascript
AngularJs的$http发送POST请求,php无法接收Post的数据问题及解决方案
Aug 13 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
常见PHP数据库解决方案分析介绍
2015/09/24 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
什么是DOM(Document Object Model)文档对象模型
2012/03/05 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
js阻止冒泡和默认事件(默认行为)详解
2016/10/20 Javascript
javascript编写简易计算器
2017/05/06 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
2018/07/25 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
vue+axios+element ui 实现全局loading加载示例
2018/09/11 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
Python程序语言快速上手教程
2012/07/18 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
浅述python2与python3的简单区别
2018/09/19 Python
CentOS7安装Python3的教程详解
2019/04/10 Python
介绍CSS3使用技巧5个
2009/04/02 HTML / CSS
学生处主任岗位职责
2013/12/01 职场文书
受欢迎的大学生自我评价
2013/12/05 职场文书
班组长工作职责
2013/12/25 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书