js-提前声明和new操作符理解
1、提前声明:声明变量后,js会把声明部分提前到作用域前面。
var a=1;
function aheadOfStatement(){
alert(a);
var a=2;
}
这段代码结果是undefined,因为函数aheadOfStatement中的声明了变量a,并覆盖了全局变量a,但是没有赋值。等价于下面的代码:
var a=1;
function aheadOfStatement(){
var a;
alert(a);
a=2;
}
2、new的理解
如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。
实例1:函数没有返回值
function testNoReturn(){
var a=1;
}
var test=testNoReturn();
var testWithNew=new testNoReturn();
alert(test); //undefined
alert(testWithNew); //[object Object]
alert(testWithNew instanceof testNoReturn); //true
实例2:函数返回基本类型;没有new的,得到a的值,有new的,得到函数testWithReturn的prototype。
function testWithReturn(){
var a=1;
return a;
}
var test=testWithReturn();
var testWithNew=new testWithReturn();
alert(test); //
alert(testWithNew); //[object Object]
alert(testWithNew instanceof testWithReturn); //true
实例3:函数返回引用类型;没有new的,得到了Array类型的变量,有new的,也得到了Array类型的变量,而不是得到testWithReturn的prototype。
这个实例中,没有new的,是构造函数的工厂模式;有new的,是构造函数的寄生构造函数模式。
function testWithReturn(){
var a=new Array();
a=[1,2,3];
return a;
}
var test=testWithReturn();
var testWithNew=new testWithReturn();
alert(test); //[1,2,3]
alert(testWithNew); //[1,2,3]
alert(testWithNew instanceof testWithReturn); //false
alert(test instanceof Array); //true
alert(testWithNew instanceof Array); //true
//函数返回引用类型后,有没有new,都得到的是引用类型,有了new,也不返回函数的prototype
实例4:this绑定;有new的,this指向的是testWithNew。没有this的,指向的是调用testThis的对象,在全局环境中是window。所以可以找到a变量。
var a=1;
function testThis(){
alert(this.a);
this.b=2;
}
var test=testThis(); //
var testWithNew=new testThis();//undefined
alert(testWithNew.b);//
ps:
观此博文(http://www.cnblogs.com/RitaRichard/archive/2011/10/12/2208902.html)有感,只想记录知识点,实例大部分与其相似,望原作者见谅。
js-提前声明和new操作符理解的更多相关文章
- JS提前声明和定义方式
来源:JS的函数定义方式以及对声明的提前 以下代码,声明语句会被提前到当前作用域(全局作用域和函数作用域)的顶部.但赋值语句不会提前,依然留在原地 var x = function(){}; var ...
- js的声明提前
由于js声明提前的作用,所以在js中后面定义的函数也可以再前面使用. 不过,项目中看到过这样的写法 var a = function(){}, b = function(){}; 这种写法使代码看上去 ...
- 理解 Delphi 的类(十) - 深入方法[17] - 提前声明
//要点17: 如果前面的方法要调用后面的方法, 后面的方法需要提前声明 function MyFunB(x: Integer): Integer; forward; {使用 forward 指示字提 ...
- 详解js变量声明提升
之前一直觉会认为javascript代码执行是由上到下一行行执行的.自从看了<你不知道的JS>后发现这个观点并不完全正确.先来给大家举一个书本上的的例子: var a='hello wor ...
- js函数声明外面使用小括号括起来再接一个小括号的写法
js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...
- JavaScript学习系列博客_21_JavaScript 变量、函数的提前声明
变量的提前声明(全局作用域) - 我们知道js的代码是自上而下执行的.如下,console.log(a)在var a=10前面,但是结果输出的是undefined. - 使用var关键字声明的变量,会 ...
- js中的回调函数的理解和使用方法
js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...
- (转载)javascript函数作用域和提前声明
http://www.cnblogs.com/ArthurPatten/p/3274080.html 一些语言如C.java都有块级作用域,即花括号内的每一段代码都具有各自的作用域,而且变量在声明它们 ...
- javascript函数作用域和提前声明
一些语言如C.java都有块级作用域,即花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,但是javascript没有块级作用域.javascript使用函数作用域,即 ...
随机推荐
- 三分钟部署Laxcus大数据管理系统
Laxcus是Laxcus大数据实验室历时五年,全体系自主设计研发的国内首套大数据管理系统.能够支撑百万台级计算机节点,提供EB量级存储和计算能力,兼容SQL和关系数据库.最新的2.x版本已经实现对当 ...
- 关于AIR新浪登录测试
/** *由于在应用申请中,我设置的域名属于新浪云,因此在本地测试的话肯定不能成功的,有个办法就是直接在新浪云那边授权成功后,将token的值直接使用post或者get方法传递过来,直接在本地 *lo ...
- 查看linux占用内存/CPU最多的进程
可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 可以使用一下命令查使用CPU最多的10个进程 ps -aux | sort -k3nr ...
- svn执行clean up命令时报错
svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”.无论你到那个父 ...
- java 中的fanal
三.java中有final final 修饰符 关键字可用于修饰类,变量和方法,final关键字有点类似于C#里的sealed 关键字,用于表示它修饰的类,方法和变量不可改变. fina修饰变量时,表 ...
- HTML你应该知道的三大基本元素
顶级.块级.内联,html元素的三大分类 如果将这些元素细分, 又可以分别归为顶级(top-level)元素,块级(block-level)元素和内联(inline)元素. 1. Top-level ...
- Windows Phone开发(12):认识一下独具个性的磁贴(转)
对"磁贴"的理解是一点也不抽象的,为什么呢?只要你愿意启动WP系统,无论你是在模拟器中还是在真机中,是的,桌面上那一块块像地板的玩意儿,就是磁贴了.(图:磁贴) 在上图中,我们很直 ...
- Android IOS WebRTC 音视频开发总结(五十)-- 技术服务如何定价?
这篇文章最早是杜老师写的,看完感触很深,加上之前跟咨询公司的朋友也讨论过这方面的问题,所以结合自己的经验,做了些删改(得到了杜老师的授权). 先通过下面几个简单的问题来了解技术服务: 问题1:技术服务 ...
- javaSE第二十天
第二十天 254 1:递归(理解) 254 (1)方法定义中调用方法本身的现象 254 (2)递归的注意事项 255 (3)递归的案例: 255 A:递归求阶乘 2 ...
- php实现文件上传的源码
php实现文件上传的源码,更多php技术开发就去php教程网,http://php.662p.com <?php ##author :Androidyue ##sina @androidyue ...