关键词:
- 1.作为对象方法调用
- 2.作为普通函数调用
- 1.作为普通函数进行调用
- 2.将函数赋值给一个对象
- 3.callback内部的this指向了window
- 4.解决callback内部的this问题
- 3.构造器调用
- 1.普通构造器
- 2.如果构造器显示地返回了一个object类型对象
- 4.Function.prototype.call 或 Fucktion.prototype.apply调用
- 1.跟普通的函数调用相比,可以动态的传入函数的this
1.作为对象方法调用
var obj = { a:1, getA:function(){ console.log(this===obj); console.log(this.a); } } obj.getA();
2.作为普通函数调用
//作为普通函数进行调用 var name = ‘SmarTom‘; var getName = function(){ return this.name; } console.log(getName());//返回undefined /*-------------------------------------------------------*/ //将函数赋值 var obj ={ name : ‘SmarTom‘, getName : function(){ return this.name; } } /*将函数赋值给一个对象 相当于 var getname=function(){ asdfasdf } */ var getname = obj.getName; console.log(getname()); //返回undefined /*===============请忽视分割线=============================*/ var obj ={ name : ‘SmarTom‘, getName : function(){ return this.name; } } console.log(obj.getName()); //返回SmarTom /*===============我知道你不会当做不知道====================*/
有时候我们会遇到一个困扰,比如在div节点事件函数内部,有一个局部的callback方法,callback方法被作为普通函数来调用时,callback内部的this指向了window,但我们往往认为他是指向该div的节点
,如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="div1">我是一个div</div> <script> document.getElementById(‘div1‘).onclick = function(){ alert(this.id); //作为对象调用div1 var callback =function(){ alert(this.id); } callback(); //调用的是全局的this 弹出 undefined } </script> </body> </html>
解决方法:
1.将this赋值给临时变量
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="div1">我是一个div</div> <script> document.getElementById(‘div1‘).onclick = function(){ var that = this; alert(that.id); //作为对象调用div1 var callback =function(){ alert(that.id); } callback(); //调用的是全局的this 弹出 undefined } </script> </body> </html>
2.使用严格模式 "use strict" 注意使用的时候会忽略this=undefined 的情况
3.构造器调用
JavaScript中没有类,但是可以从构造器中创建对象,同时也提供了new运算符,使得构造器更像一个类。其实就是用new构造一个对象,看起来更像是类
通常情况下,构造器里的this就指向返回的这个对象
var myClass = function(){ this.name = ‘SmarTom‘; } var obj = new myClass(); console.log(obj.name); //返回SmarTom
但使用new调用构造器时,还要注意一个问题,如果构造器显示地返回了一个object类型对象,那么此次运算结果最终会返回这个对象,可不是我们之前期待的this;
var myClass = function(){ this.name = ‘SmarTom‘; return { name : "Bob Dylan" } } var obj = new myClass(); console.log(obj.name); //返回Bob Dylan
4.Function.prototype.call 和 Function.prototype.apply调用
跟普通的函数调用相比,可以动态的传入函数的this
var obj1 = { name : "SmarTom", getName : function(){ return this.name; } }; var obj2 = { name :"Bob Dylan" }; console.log(obj1.getName()); //输出‘SmarTom‘ console.log(obj1.getName.call(obj2)); //输出BobDylan
《javascript设计模式与开发》笔记6.高阶函数
1.函数作为参数传递1.回调函数2.Array.prototype.sort 2.函数作为返回值输出1.判断数据的类型 3.高级函数的实现AOP 4.高阶函数的其他应用1.currying函数柯里化2.uncurring3.函数节流4.分时函数5.惰性加载函数1.函数作为参数传... 查看详情
《javascript设计模式与开发》笔记3.call和apply
1.改变this指向 2.Function.prototype.bind 3.借用其他对象方法1.借用实现继承2.实现恶心的Array.prototype.push.callArray.prototype.join.callArray.prototype.slice.callObject.prototype.toString.call1.改变this指向varobj 查看详情
javascript设计模式与开发实践阅读笔记(10)——组合模式
组合模式:一些子对象组成一个父对象,子对象本身也可能是由一些孙对象组成。 有点类似树形结构的意思,这里举一个包含命令模式的例子1varlist=function(){//创建接口对象的函数2return{3arr:[],//执行列表用来存储需要执行的... 查看详情
《javascript设计模式与开发》笔记2.this指针
1.作为对象方法调用 2.作为普通函数调用1.作为普通函数进行调用2.将函数赋值给一个对象3.callback内部的this指向了window4.解决callback内部的this问题 3.构造器调用1.普通构造器2.如果构造器显示地返回了一个object类型对象... 查看详情
javascript设计模式与开发实践阅读笔记——迭代器模式
迭代器模式:指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序... 查看详情
javascript设计模式与开发实践阅读笔记——命令模式
命令模式:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。 说法很... 查看详情
javascript设计模式与开发实践阅读笔记——代理模式
代理模式:是为一个对象提供一个代用品或占位符,以便控制对它的访问。代理模式的关键是,当客户不方便直接访问一个对象或者不满足需要的时候,提供一个替身对象来控制对这个对象的访问,客户实际上访问的是替身对象... 查看详情
javascript设计模式与开发实践阅读笔记——策略模式
策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。我的理解就是把各种方法封装成函数,同时存在一个可以调用这些方法的公共函数。这样做的好处是可以消化掉内部的分支判断,使代码效率更... 查看详情
《javascript设计模式与开发》笔记5.关于正确写一个闭包
1.如何正确使用闭包1.常用闭包varasd=(function(){varvalue=0//私有变量放入内存returnfunction(){//biubiubiu发射火箭}})();asd(); 2.一个引用引发的闭包问题varasdf=function(){varvalue=0;returnfunction(){//火箭升空}}varf=asdf();//作为一个函数的引用引发... 查看详情
javascript设计模式与开发实践阅读笔记——单例模式
定义单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。具体来说,就是保证有些对象有且只有一个,比如线程池、全局缓存、浏览器中的window对象等。在js中单例模式用途很广,比如登录悬浮窗,我希望无... 查看详情
javascript设计模式与开发实践阅读笔记——高阶函数的其他应用
高阶函数的其他应用1.currying函数柯里化,又称部分求值,一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待... 查看详情
javascript设计模式与开发实践读书笔记(1-3章)
第一章面向对象的Javascript1.1多态在面向对象设计中的应用 多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切多态会搞定换句话说就是:... 查看详情
javascript设计模式与开发实践读书笔记http://www.open-open.com/lib/view/open1469154727495.html
JavaScript设计模式与开发实践读书笔记最近利用碎片时间在Kindle上面阅读《JavaScript设计模式与开发实践读书》这本书,刚开始阅读前两章内容,和大家分享下我觉得可以在项目中用的上的一些笔记。我的github项目会不定时更新,... 查看详情
学习笔记javascript设计模式与开发实践(职责链模式)----13http://blog.csdn.net/pigpigpig4587/article/details/50442406#
第13章职责链模式职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止。职责链模式的... 查看详情
javascript高级程序设计笔记(很重要尤其是对象的设计模式与继承)
varobj={‘a‘:‘a‘};varfun=function(){}console.log(typeofobj);//objectconsole.log(typeoffun);//functionvara;console.log(a===undefined);//trueconsole.log(typeofb);//true未声明的变量使用会报错,但是他的typeof=undefinedvar 查看详情
《javascript高级程序设计》笔记目录
第1章什么是JavaScript第2章HTML中的JavaScript第3章语言基础第4章变量、作用域与内存第5章基本引用类型第6章集合引用类型第7章迭代器与生成器第8章对象、类与面向对象编程第9章代理与反射第10章 查看详情
[笔记]《javascript高级程序设计》-ajax与comet
在XHR出现之前,Ajax式的通信必须借助一些hack手段来实现,大多数是使用隐藏的框架或内嵌框架。一、XMLHttpRequest对象1XHR的用法 在使用XHR对象时,要调用的第一个方法是open(),它接受3个参数:... 查看详情
[笔记]《javascript高级程序设计》-事件
JavaScript与HTML之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。可以使用侦听器(或处理程序)来预定事件,以便时间发生时执行相应的代码。这种在传统软件工程中... 查看详情