javascript中this的学习总结
在开发中,this多使用在function函数中,也正是由于调用function的对象的不同,才导致了this的指向不同。需要明白(1)、function也是对象;(2)、function执行时是在某个特定的上下文中执行的。
function是对象,对象就有方法,function中最核心的方法是call方法。
举例call使用的方法:
function say(content){
console.log('From '+this+': Hello '+content);
}
say.call('Bob','World');//From Bob: Hello World
分析call用法:(1)、把第二个到最后一个参数作为函数执行时要传入的参数
(2)、把函数执行时的this指向第一个参数
上面例子通过call,让函数执行时的this指向“Bob”,然后把“World”作为参数传入,所有得到那样输出结果
再如:
function say(word){
console.log(word);
}
say('Hello world');//Hello world
通过以上方式转换为call使用
say.call(window,'Hello world');//Hello world
所以如果想知道function中this指代是谁,可以在脑海中做call使用转换
总结:每次看到 funcName(xxx)时,转换funcName.call(window,xxx);当然此处window指代一般情况下this
例1、匿名函数如:
(function say(word){
console.log(word);
})('Hello word');
call转换等价于
(function say(word){
console.log(word);
}).call(window,'Hello word');
例2、对象中函数调用如:
var person={
name:'Bob',
run:function(time){
console.log(this.name+' has been running for over '+time+' minutes');
}
};
person.run(30);//Bob has been running for over 30 minutes
call调用转换等价于
person.run.call(person,30);//Bob has been running for over 30 minutes
如果是
var person={
name:'Bob',
run:function(time){
console.log(this.name+' has been running for over '+time+' minutes');
}
};
var name='Tom';
person.run(30);//Bob has been running for over 30 minutes
person.run.call(window,30);//Tom has been running for over 30 minutes
例3、
var obj={
x:20,
f:function(){
console.log(this.x);
}
};
obj.f();//等价于obj.f.call(obj);//==>20
obj.innerobj={
x:30,
f:function(){
console.log(this.x);
}
};
obj.innerobj.f();//等价于obj.innerobj.f.call(obj.innerobj);//==>30
例4、
var x=10;
var obj={
x:20,
f:function(){
console.log(this.x);
var foo=function(){
console.log(this.x);
};
foo();
}
};
obj.f();//等价于obj.f.call(obj);//==>20 10
上面,obj中f函数中定义的foo,this指代window,而foo作用域在obj.f函数内
如果也想让上面foo函数也输出obj内的x,改写代码如下:
var x=10;
var obj={
x:20,
f:function(){
console.log(this.x);
var that=this;
var foo=function(){
console.log(that.x);
};
foo();
}
};
虽然上面foo 函数的this仍然指向window,但是that取得obj中this,输出的是that.x, 也就是obj中的x。
例5、
var x=10;
var obj={
x:20,
f:function(){
console.log(this.x);
}
};
obj.f();//相当于obj.f.call(obj);//==>20
var fOut=obj.f;
fOut();//相当于fOut.call(window);//==>10
var obj2={
x:30,
f:obj.f
};
obj2.f();//相当于obj2.f.call(obj2);//==>30
this是在执行时才会被确认的
js构造函数
用于构造函数
先看一段代码:
func person(name) { this.name = name;} var caibirdme = new person("deen"); // caibirdme.name == deen
我上面也说了,函数在用作构造函数时同样可以用call方法去代替,那这里怎么代替呢?
这里你又需要明确一点:new constrcut()是一种创建对象的语法糖
它等价于
function person(name) {
this.name = name;
}
var foo = new person("deen");
//通过new创建了一个对象
//new是一种语法糖,new person等价于
var bar = (function(name) {
var _newObj = {
constructor : person,
__proto__ : person.prototype,
};
_newObj.constructor(name);
// _newObj.constructor.call(_newObj, name)
return _newObj;
})();
javascript中this的学习总结的更多相关文章
- javascript中的正则表达式学习
一.前言 关于正则表达式自身的语法这里不做过多介绍(详情可参见http://www.php100.com/manual/unze.html),这里仅仅解释javascript中和正则表达式相关的几个方 ...
- JavaScript中的EcMAScript学习笔记
一.Javascript概述(知道) a.一种基于对象和事件驱动的脚本语言 b.作用: 给页面添加动态效果 c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAs ...
- JavaScript中 Promise的学习以及使用
今天一个哥们发过来一段js代码,没看懂,就顺便学习了一下,代码如下 Promise.resolve('zhangkai').then(value => {console.log(value)} ...
- JavaScript中NODE操作学习总结
Node: 1.在 HTML DOM (文档对象模型)中,每个部分都是节点: 文档本身是文档节点 所有 HTML 元素是元素节点 所有 HTML 属性是属性节点 HTML ...
- Javascript中Object常用方法学习
1.Object.assign 函数(对象)(JavaScript) 将来自一个或多个源对象中的值复制到一个目标对象.语法: Object.assign(target, ...sources ); 此 ...
- javascript中的事件学习总结
一.实例: 一段用js实现的固定边栏滚动特效代码(跨浏览器使用): 二.总结: 由于事件处理在不同浏览器之间存在差异(主要是要考虑ie8及以下浏览器的兼容性),所以在使用处理事件的方法之前,先要判断当 ...
- javascript中的面向对象—— 学习1
面向对象:Object Oriented(OO) 一切事物皆对象,通过面向对象的方式,将显示世界的事物抽象成对象,将显示世界中的关系抽象成类.继承,帮助人们实现对显示世界的抽象与数字建模:--百科 一 ...
- 关于javascript中defineProperty的学习
语法 Object.defineProperty(obj, prop, descriptor) 参数 obj 要在其上定义属性的对象. prop 要定义或修改的属性的名称. descriptor 将被 ...
- 前端学习 第六弹: javascript中的函数与闭包
前端学习 第六弹: javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) { ...
随机推荐
- 给vps设置ssh供爬墙使用
在服务器上建一个 username : 添加用户:useradd -s /bin/false username,将用户的shell设置成/bin/false.这样用户就无法与系统进行交互. 设置密码: ...
- C++ c++与C语言的区别(实用性增强,register关键字增强,全局变量检测增强)
//区别①:实用性增强 #include<iostream> using namespace std; //C语言中的变量都必须在作用域开始的位置定义!! //C++中更强调语言的“实用性 ...
- 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
{"当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值"} 对于这个异常可以从两个角度来处理:A:数据库执行语句 B: ...
- puer工具的使用
在项目开发的过程当中,总会有前端开发快完成,后端接口却迟迟提供不了的情况.此时为了不影响前端开发的进度,我们可以借助puer来模拟后端接口测试.简单的说,puer就是一个可以实时刷新的前端服务器.具体 ...
- ViewConfiguration.getScaledTouchSlop () 用法
getScaledTouchSlop是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件.如果小于这个距离就不触发移动控件,如viewpager就是用这个距离来判断用户是否翻页 ViewC ...
- [MySQL] 按日期进行统计(前一天、本周、某一天)
在mysql数据库中,常常会遇到统计当天的内容.例如,在user表中,日期字段为:log_time统计当天 sql语句为: select * from user where date(log_time ...
- Linux第三次学习笔记
#信息的表示和处理 三种重要的数字表示 1. 无符号数编码: 基于传统的二进制表示法,表示大于或者等于零的数字. 2. 补码编码: 表示有符号数整数的最常见的方式,有符号数就是只可 以为正或者为负的数 ...
- web性能优化之:no-cache与must-revalidate深入探究
引言 稍微了解HTTP协议的前端同学,相比对Cache-Control不会感到陌生,性能优化时经常都会跟它打交道. 常见的值有有private.public.no-store.no-cache.mus ...
- windows网络编程的一些理论
参考自<VC++深入详解> 这是我在看书时记录下来的东西. 注:下面的Socket其实都应该是socket 第14章网络编程 Socket是连接应用程序与网络驱动程序的桥梁,Socket在 ...
- 一次ssl的手动实现——加密算法的简单扫荡
引言 最近LZ在公司里接了一个活,要发布一些服务给公司的合作伙伴调用.这种工作LZ可谓是轻车熟路,之前已经做了无数服务端.不过与以往不同的是,这次的服务是要发布在互联网上的,因此不能再像之前的套路一样 ...