js中var self=this的解释
每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments,换句话说,每个函数都有属于自己的this对象,这个this对象是在运行时基于函数的执行环境绑定的,即在全局对象中,this指向的是window对象;在自定义函数中,this对象指向的是调用这个函数的对象,
也就是说,this指向的是调用执行环境的那个对象。
如果是在函数嵌套环境中,this指代的是调用外部函数或者内部函数的执行环境的对象;
(注意:可以通过使用call()或者apply()改变函数执行环境的情况下,this就会指向其他对象。)
看例子吧:
/*----- 2014-2-10 这个例子是错误的 -----*/
function BaseType(name,age){
//用一个变量保存当前函数执行环境中的this对象
//这里可能会有疑问:为什么非得把this保存起来呢?这是因为,内部函数(比如本函数里面包含的两个匿名函数)
//在搜索this变量时,只会搜索到属于它自己的this,而不会搜索到包含它的那个函数的this。
//所以,为了在内部函数能使用外部函数的this对象,要给它赋值了一个名叫self的变量。
var self=this;
this.name=name;
this.age=age;
this.sayHello=function(){
console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
}
this.saySomething=function(){
//此处用法有点欠妥,完全可以不用self,而用this
//self.sayHello();
//正确的做法是:
return function () { self.sayHello(); }
//通常用法:将上下文this缓存到一个变量中
//以便在本函数作用域内包含另一个函数作用域的情况下可以继续使用此上下文对象this
//如果省略var self=this; 这行,那么在嵌套函数作用域内就无法访问到本函数作用域的成员了。
}
}
var b1=new BaseType("wede",30);
b1.saySomething(); //My name is wede, and i'm 30years old.
从结果来看,是预期的结果。
那么这里可能又会出现新的疑问:为什么在saySomething()方法中非要用self.sayHello()来调用呢,
直接sayHello()多好?
其实这又涉及到另一个话题:实例成员与局部成员。
我们创建构造函数的意义就是要用它来创建实例,那么所有属于实例的成员都需要用this来定义;
而只有那些不属于实例的成员才不会用this定义;
当然,用this定义了方法以后,在函数作用域内部要调用此方法时,就需要加上this了。
为了证明这一点,来看下面的代码:
function BaseType(name,age){
var self=this;
this.name=name;
this.age=age;
this.sayHello=function (){
console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
}
this.saySomething=function(){
sayHello();
}
}
var b1=new BaseType("wede",30);
b1.saySomething(); //ReferenceError: sayHello is not defined
结果显示:sayHello方法未定义。
就是说明,我们调用的其实是局部方法sayHello,而现在只有实例方法sayHello,所以会出现异常。
下面来改装下(注意加粗的部分):
function BaseType(name,age){
var self=this;
this.name=name;
this.age=age;
var sayHello=function (){
console.log("My name is "+name+", and i'm "+age+"years old.");
}
this.saySomething=function(){
sayHello();
}
}
var b1=new BaseType("wede",30);
b1.saySomething();//My name is wede, and i'm 30years old.
可以看出,输出了预期的结果。
而这时候,我们把sayHello方法变成了一个局部方法(对于实例不可见),然后再在saySomething方法中调用就可以了。
js中var self=this的解释的更多相关文章
- js中var的有或无--重复声明和以后的声明
js中var的有或无--重复声明和以后的声明 使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误. 如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色. 如果重复 ...
- 浅谈JS中 var let const 变量声明
浅谈JS中 var let const 变量声明 用var来声明变量会出现的问题: 1. 允许重复的变量声明:导致数据被覆盖 2. 变量提升:怪异的数据访问.闭包问题 3. 全局变量挂载到全局对象:全 ...
- 【前端开发】】js中var写和不写的区别
js中var用与不用的区别 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. v ...
- js中var,let,const理解
var变量提升: 解释:在声明a之前输出a,因为a是使用var声明变量得到提升,解释为下句 var a: console.log(a) a = 1; var声明会提到最上面的位置,但是赋值的位置还是当 ...
- js中,var 修饰变量名和不修饰的区别
js中 允许在定义变量的时候 不加var 修饰符.js会在当前作用域下寻找上下文是否定义了此变量, 如果没有找到则会为这个变量分配内存.当且将其视为window的成员. 也就是全局变量. 如果加了va ...
- js中var 笔记
js中声明变量会用到Var; 1,var a;声明一个变量a,此时输出a,会显示undefined:因为此时的a未定义: 2, var a=0;和b=0;有什么区别呢? 当声明一个全局变量时,实际是定 ...
- js 中var that=this
js中经常出现var that=this,为什么这么做? http://stackoverflow.com/questions/4886632/what-does-var-that-this-mean ...
- JS中var声明与function声明两种函数声明方式的区别
JS中常见的两种函数声明(statement)方式有这两种: // 函数表达式(function expression) var h = function() { // h } // 函数声明(fun ...
- js中var
js中声明一个变量的时候,建议要加上var.如果不加,除非你知道自己在干什么,否则哪天会吃亏哈哈. 不加var,js会认为你声明的是全局变量. 举个小例子. function test1(){ a = ...
随机推荐
- email
#region 邮件帮助类 //+-------------------------------------------------------------------+ //+ FileName: ...
- SOCKET 服务器停止服务时清理连接操作
刚想到一个情况,正好是工作中遇到的. 当服务器停止时,正好有连接的请求正在被处理,而此时服务端需要等待该请求被正常的处理完,然后给客户端发送响应报文. 正常情况下,服务器停止的时候,是希望发送了响应报 ...
- java 实现WebService 以及不同的调用方式
webservice: 就是应用程序之间跨语言的调用 wwww.webxml.com.cn 1.xml 2. wsdl: webservice description l ...
- python中的单引号,双引号,三引号
转载自: http://blog.csdn.net/wanghai__/article/details/6285310 先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行 如: s1 ...
- 【OpenCV练习】简单显示图片的代码
今天依照网上的教程尝试了一下最基本的图片显示. 首先想说一下编译时出现的问题,开始时在编译时会出现无法识别cvReleaseImage的情况,是因为没有在配置中包含相应的core的库文件. 加进去就解 ...
- Esfog_UnityShader教程_UnityShader语法实例浅析
距离上次首篇前言已经有一段时间了,一直比较忙,今天是周末不可以再拖了,经过我一段时间的考虑,我决定这一系列的教程会避免过于深入细节,一来可以避免一些同学被误导,二来会避免文章过于冗长难读, 三来可以让 ...
- 后台数据库读取Html值 到前台显示不了样式
@Html.Raw(FieldValue) 像一些Html代码 传到前台编译不了,直接显示出来 FieldValue 是后台传过来的值 viewBag
- 重新介绍 JavaScript
简介 为什么需要这个重新介绍呢?因为 JavaScript 已经完全可以被称为世界上被误解最严重的编程语言了.虽然它被当做玩具来用,但是藏在让人迷惑的简单表象下面的,是强大的语言特性.从2005年,一 ...
- Xcode插件安装
使用Xcode开发中,经常使用到各种插件,可以大大提高工作效率,我一般使用Alcatraz工具安装插件,下面介绍一下插件的安装步骤. 1.通过一下命令安装: mkdir -p ~/Library/Ap ...
- 拒绝访问 temp 目录。用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限
在部署IIS时候会出现下图错误,拒绝访问 temp 目录.用来运行 XmlSerializer 的标识“IIS APPPOOL\UGAS”没有访问 temp 目录的足够权限 解决方法: 在IIS信息管 ...