在开发中,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的学习总结的更多相关文章

  1. javascript中的正则表达式学习

    一.前言 关于正则表达式自身的语法这里不做过多介绍(详情可参见http://www.php100.com/manual/unze.html),这里仅仅解释javascript中和正则表达式相关的几个方 ...

  2. JavaScript中的EcMAScript学习笔记

    一.Javascript概述(知道)    a.一种基于对象和事件驱动的脚本语言    b.作用: 给页面添加动态效果    c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAs ...

  3. JavaScript中 Promise的学习以及使用

    今天一个哥们发过来一段js代码,没看懂,就顺便学习了一下,代码如下  Promise.resolve('zhangkai').then(value => {console.log(value)} ...

  4. JavaScript中NODE操作学习总结

    Node: 1.在 HTML DOM (文档对象模型)中,每个部分都是节点:    文档本身是文档节点     所有 HTML 元素是元素节点     所有 HTML 属性是属性节点     HTML ...

  5. Javascript中Object常用方法学习

    1.Object.assign 函数(对象)(JavaScript) 将来自一个或多个源对象中的值复制到一个目标对象.语法: Object.assign(target, ...sources ); 此 ...

  6. javascript中的事件学习总结

    一.实例: 一段用js实现的固定边栏滚动特效代码(跨浏览器使用): 二.总结: 由于事件处理在不同浏览器之间存在差异(主要是要考虑ie8及以下浏览器的兼容性),所以在使用处理事件的方法之前,先要判断当 ...

  7. javascript中的面向对象—— 学习1

    面向对象:Object Oriented(OO) 一切事物皆对象,通过面向对象的方式,将显示世界的事物抽象成对象,将显示世界中的关系抽象成类.继承,帮助人们实现对显示世界的抽象与数字建模:--百科 一 ...

  8. 关于javascript中defineProperty的学习

    语法 Object.defineProperty(obj, prop, descriptor) 参数 obj 要在其上定义属性的对象. prop 要定义或修改的属性的名称. descriptor 将被 ...

  9. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

随机推荐

  1. Silverlight OOB程序签名问题

    浏览器外部署Silverlight时,为了让部署到本地的Silverlight应用程序保持最新,通常需要在应用程序中添加更新检查的功能.具体实现可参见这儿. 除了文中提到的“应用程序中使用了用户尚未安 ...

  2. C#中的Decimal类型

    这种类型又称财务类型,起源于有效数字问题.FLOAT 单精度,有效数字7位.有效数字是整数部分和小数部分加起来一共多少位.当使用科学计数法的,FLOAT型会出现很严重的错误.比如 8773234578 ...

  3. JS自定义事件之选项卡

    自定义事件是一种处理与DOM产生交互的代码逻辑片段之间耦合的很好的架构方法. 一个简单的jQuery插件——选项卡 让ul列表来响应点击事件.当用户点击一个列表项时,给这个列表项添加一个名为activ ...

  4. 实现chrome扩展启动本地进程 - 补充

    实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报  分类: Chrome Plu ...

  5. JQuery学习笔记——JQuery基础

    #,JQuery避免名称冲突的方法 var jq = jQuery.noConfilct(); jq.ready( function(){     jq("p").hidden() ...

  6. LeetCode:Palindrome Partitioning,Palindrome Partitioning II

    LeetCode:Palindrome Partitioning 题目如下:(把一个字符串划分成几个回文子串,枚举所有可能的划分) Given a string s, partition s such ...

  7. 20145208 实验五 Java网络编程

    20145208 实验五 Java网络编程 实验内容 1.用书上的TCP代码,实现服务器与客户端. 2.客户端与服务器连接 3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务 ...

  8. android的progressDialog 的使用。android数据异步加载 对话框提示

    在调用的Activity中定义一个全局的 progressDialog 点击按钮的时候调用下面这句 progressDialog = ProgressDialog.show(SearchActivit ...

  9. margin的理解

    1.盒子模型 在进行网页设计的时候,我们使用的是盒子模型,其内容如下: 整个网页就是大盒子套小盒子,小盒子又套更小的盒子来实现的.但是在做网页设计时总是搞不清margin和padding的使用方式,在 ...

  10. [C#基础]Func和Action学习

    目录 委托 Action Func 总结 委托 委托的那些事 关于委托的基本定义,在很久之前的这篇文章中,有个简单的介绍.稍微回顾一下. 委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函 ...