javascript 之 this 用法
参考视频:http://www.imooc.com/video/6430
JavaScript中的this比较灵活,也是让很多初学者摸不到头脑,那么根据在不同的环境下,在同一个函数,不同的调用方式下,那么这个this也有可能是不同的。
我们先来看,全局作用于下的this。
全局的this(浏览器)
console.log(this.document===documet);//true
console.log(this===window);//true
this.a=37;
console.log(window.a);//37
全局作用域下的this一般指的是全局对象,在浏览器里面一般指的是windows。比如上面的this.document就是window.document. 这里的this就相当于window,所以this=window.
so,this.a=window.a。
一般函数的this(浏览器)
function f1(){
return this;
}
f1()===window;//true,global object
比如我们用这样的一般函数声明和一般表达式,然后我们直接去调用这样的函数的话,那么这里面的this仍然指向全局变量,那么在浏览器里面就是window,那么在node.js里面呢,就是global对象。
function f2(){
"use strict"//ee strict mode
return this;
}
f2()===undefined;//true
我们需要注意的一点就是严格模式下呢,一般函数调用的this会指向这个undefined.
我们更常见的作为对象方法的函数的this:
var o={
prop:37,
f:function(){
return this.prop;
}
};
console.log(o.f());//logs 37
是将this作为对象方法去用的时候,我们知道,函数呢,如果作为一个对象的属性,比如我们这创建的自变量o,那么o里面有个属性f,它的值是一个函数对象,那对于这样一个把函数作为一个对象属性值的方式,我们常常叫做一个对象的方法。那么多为对象方法去调用的时候,比如这里的用o.f()去调用,这种情况的this一般会指向这样一个对象o,这里我们可以看到o.f()调用以后会返回37,因为this指向了o,所以相当于o.prop,所以最终的结果是37。
var o={prop:37};
function independent(){
return this.prop;
}
o.f=independent;
console.log(o.f());//logs 37
那么这里面,我们不止是一定要定义成函数自变量的对象,比如这里面我们定义了一个对象o,只有一个属性prop:37;那么这里面我们有个独立的independent函数,那么这里面的函数,我们仍然return this.prop,如果我直接去调用independent的话,则this依旧指向window。这里临时创建一个o的属性f(即是o.f)并且指向independent,所以这样再调用console.log(o.f(),则又跟上一条函数同理!
这里面是不是看函数是怎么创建的,而是只要将这个函数作为对象的方法,就像这个o.f()去调用的话,那么,这个this,就会指向这个o.prop。
对象原型链上的this:
var o={f:function(){return this.a+this.b;}};
var p=Object.create(o);
p.a=1;
p.b=4;
console.log(p.f());//5
创建一个对象o里面有属性f,并且函数作为属性的值,我们通过Object.create创建了一个对象p,而对象P是一个空对象,并且它的原型指向了o,那么p.a=1;p.b=4;这样创建了对象的属性,那么我去调用它原型上方法的时候,this.a和this.b依旧能取到p.a和p.b的值。这里面p的原型才是o,也就是说,调用p.f()的时候调用的时候这个对象原型对象上的o上面的属性f。
get/set方法与this:
function modulus(){
return Math.aqrt(thisre*this.re+this*this.im);
}
var 0={
re:1,
im:-1,
get phase(){
return Math.atan2(this.im,this.re);
}
};
Object.defineProperty(o,'modules',{
get:modulus,enumerable,configurable:ture});
console.log(o.phase,o.modulus);//logs-0.78 14.4142
get/set方法也是类似的,这里用的是一个modules。然后这里我们去计算this.re和this.im,这里我们用一个对象o,并且o里面有一个get方法,给这样的属性phase,再用
Object.defineProperty(object, propertyname, descriptor)去定义o的属性,这里我们同样可以调用o.phase和o.modulus去拿到o的属性,那么modules里面的this依旧会指向o的re和im,我们也要知道get/set方法里面的this也是会指向它所在的那个对象里面,那么我们临时动态区别一下O这个对象与创建.modulus的属性也是类似的,那么这一点上,和一般的对象属性作为函数对象也是类似的! 构造器中的this:
function MyClass(){
this.a=37;
}
var o= new MyClass();
console.log(o.a);//37 function C2(){
this.a=37;
return{a:38};
}
o=new C2();
console.log(o.a);//38
如果我们正常去调用MyClass这个函数的话,this就是指向全局变量window,但是如果用new MyClass来把它作为构造器去调用的话,那么MyClass的this会指向空的对象,并且这个对象会指向原型MyClass.prototype.这里使用了new以后,那么这个this会指向一个原型为MyClass.prototype属性的这样一个空对象,那么这样由于我们的this.a赋值了37,而且MyClass的返回值默认是this,所以这对象o就会输出37。那么类似的我们定义了一个函数C2,然后this.a=37,但是return里面的返回的语句是a:38,所以a就不再是37了,而是38。当我们使用new来创建这样一个构造器来这样去调用的时候,那么这样的this会指向一个原型为MyClass.prototype这样一个空对象,最后还是要看返回值,如果你没有写return语句,则默认返回this,如果有return语句返回了一个对象的话,所以会将return的对象作为返回值,所以o.a就是38. call/apply方法与this:
function add(c,d){
return this.a+this.b+c+d;
}
var 0= {a:1,b:3};
add.call(,o,5,7);//1+3+5+7=16
add.apply(o,[10,20]);//1+3+10+20=34
function bar(){
console.log(Object,prototype.toString.call(this));
}
bar.call(7);//"[object Number]"
除了不同的调用方式,每一个函数对象也会有方法,可以去修改函数执行时的里面的this,比较常见的就是call/apply。比如我这里面的函数声明add,我们用this.a和this.b,和参数c和d把这四个数相加起来。我们是怎么做的呢,我们是定义一个变量o,里面有两个属性a:1,b:3,然后通过这个对象的的call方法,把第一个参数接受那个关于this的对象,后面是5和7(也就是我们想添加的参数),也就是c=5,d=7,最终的结果是就1+3+5+7=16。其实call和apply其实没有什么差别,只是call和apply传参的方式不同,call是直接把参数变量传输进去的,而apply是将参数作为数组的形式传输进去,所以apply的结果是也是1+3+10+20=34,。现在我们来区分一下情况下用到这个call和apply,比如说,我们想调用Object,prototype.toString,但是我们想指定某一个this的时候,来调用一些我们无法直接调用的一些方法,那么我们这里去调用bar。call(7),这样就能拿到内部的这样一个标签间接的字符串。 bind方法与this:
function f(){
return this.a;
} var g=f.bind({a:"test"});
console.log(g());//test var o={a:37,f:f,g:g};
console.log(o.f(),o.g());//37 test
除了call/apply还有bind方法,bind方法只能兼容IE9以上版本,我们定义了一个函数对象f(),然后我们通过bind的方法,定义了一个a的对象,并把参数值“test”传进去,这样我们就得到了一个g对象,我们到下面调用输出的时候,发现已经调用了test这个参数,这样是采用了绑定一次,并重复去调用,仍然实现这种绑定的话,这样会比我们使用call/apply高效一点。我们下面又定义了一个函数o,然后把a赋值为37,然后f赋值了f(),g赋值了g(),然后我们输出的o.f(),o.g()是37,test.这里比较特殊的就是我们使用了bind方法,即使我们使用了bind方法,并把新绑定方法作为对象的属性去调用,那么这里依旧会按照之前的绑定去走,所以也就返回这个test
javascript 之 this 用法的更多相关文章
- #Javascript:this用法整理
常用Javascript的人都知道,[this這個關鍵字在一個函式內究竟指向誰]的這個問題很令人頭大,本人在這裡整理了一下Javascript中this的指向的五種不同情況,其中前三種屬於基本的情況, ...
- 好程序员web前端分享javascript关联数组用法总结
好程序员web前端分享javascript关联数组用法总结,有需要的朋友可以参考下. Hash关联数组定义 代码如下 // 定义空数组 myhash = { } // 直接定义数组 myhash = ...
- JS的javascript:void(0)用法
javascript:void(0)用法如下: <a href="javascript:void(0)"></a> // 执行js函数,0表示不执行函数. ...
- Javascript的this用法---阮一峰
Javascript的this用法 作者: 阮一峰 日期: 2010年4月30日 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比 ...
- javascript:void(0);用法及常见问题解析
void 操作符用法格式: javascript:void (expression) 下面的代码创建了一个超级链接,当用户以后不会发生任何事.当用户链接时,void(0) 计算为 0,但 Javasc ...
- [JS]Javascript的this用法
转自:阮一峰 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着 ...
- javascript的setTimeout()用法总结,js的setTimeout()方法
引子 js的setTimeout方法用处比较多,通常用在页面刷新了.延迟执行了等等.但是很多javascript新手对setTimeout的用法还是不是很了解.虽然我学习和应用javascript已经 ...
- javascript array类型用法
javascript高级编程-Array引用类型用法总结 2016-09-17 | 357 引用类型-Array类型 引用类型是一种数据结构,用于将数据和功能联系起来. 创建对象的方式: ...
- javascript typeof()的用法与运算符用法
typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typeof[()expression[]] ; expression 参数是需要查找类型信息的任意表达式. 说明 typeof 运算 ...
- Javascript的this用法及jQuery中$this和$(this)的区别
this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 1.this就是全 ...
随机推荐
- WebApi2官网学习记录---OData中的查询
EMD安全 查询语法是基于entity data model(EDM),不是基于底层的model类型,可以从EDM排除一个属性,这样这个属性在client就不能被查询了. 有两种方式可以从EDM中排除 ...
- SQLSERVER内核架构剖析 (转)
我们做管理软件的,主要核心就在数据存储管理上.所以数据库设计是我们的重中之重.为了让我们的管理软件能够稳定.可扩展.性能优秀.可跟踪排错. 可升级部署.可插件运行,我们往往研发自己的管理软件开发平台. ...
- C#读取USB的一些相关信息
在USB\VID_05A9&PID_2800\5&1BFE1C47&0&8里面,USB代表设备类型,5&1BFE1C47&0&8代表设备连接位置 ...
- 11 java 反射机制
Java反射机制的适用场景及其利与弊: http://blog.csdn.net/zolalad/article/details/29370565 http://my.oschina.net/u/10 ...
- unique &unique_copy
unique (ForwardIterator first, ForwardIterator last); unique (ForwardIterator first, ForwardIterat ...
- CSS Hacks 总结
CSS hack由于不同的浏览器,对CSS的解析认识不一样,因此会导致生成的页面效果不一样,我们就需要针对不同的浏览器去写不同的CSS,让他能在不同的浏览器中也能得到我们想要的页面效果. CSS ha ...
- WordPress插件制作教程(二): 编写一个简单的插件
上一篇说到了如何创建一个插件,我想大家看了之后一定会有所收获,这一篇简单给大家写一个插件样例,让大家有一个基本的印象.这个插件的样例就是当你激活这个插件后会在你的每篇文章中插入一段自己定义好的内容,比 ...
- Ibatis 后台打印完整的sql语句
http://blog.csdn.net/deng11342/article/details/9122015 http://www.blogjava.net/libin2722/archive/200 ...
- 距离顶部估计像素,显示div!
<html> <head> <title>slide</title> <style type="text/css"> # ...
- Scala学习笔记--枚举
枚举 scala不用关注枚举的特别语法,取而代之的是标准库中的类, scala.Enumeration 想要创建新的枚举,只需要拓展这个类的对象即可 object Color extends Enum ...