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 实现导航栏悬停效果(续2)
Sep 24 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
Feb 10 Javascript
JavaScript实现生成GUID(全局统一标识符)
Sep 05 Javascript
JavaScript中实现最高效的数组乱序方法
Oct 11 Javascript
原生JavaScript实现Ajax的方法
Apr 07 Javascript
vuejs指令详解
Feb 07 Javascript
Angular实现购物车计算示例代码
Feb 21 Javascript
深入理解Javascript中的作用域链和闭包
Apr 25 Javascript
从零开始学习搭建React脚手架项目
Aug 23 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
Sep 14 Javascript
微信小程序解析富文本过程详解
Jul 13 Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 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模板,主要想体现一下思路
2006/12/25 PHP
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
PHP中overload与override的区别
2017/02/13 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
Javascript实现异步编程的过程
2018/06/18 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
vue实现百度搜索功能
2020/12/28 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
Python单例模式实例分析
2015/01/14 Python
django+echart数据动态显示的例子
2019/08/12 Python
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
神话般的珠宝:Ross-Simons
2020/07/13 全球购物
后勤岗位职责
2013/11/26 职场文书
高中军训感言1000字
2014/03/01 职场文书
工作证明范本(2篇)
2014/09/14 职场文书
2015年文明创建工作总结
2015/04/30 职场文书
安全教育主题班会总结
2015/08/14 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android
详解Alibaba Java诊断工具Arthas查看Dubbo动态代理类
2022/04/08 Java/Android
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android