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操作符理解的更多相关文章

  1. JS提前声明和定义方式

    来源:JS的函数定义方式以及对声明的提前 以下代码,声明语句会被提前到当前作用域(全局作用域和函数作用域)的顶部.但赋值语句不会提前,依然留在原地 var x = function(){}; var ...

  2. js的声明提前

    由于js声明提前的作用,所以在js中后面定义的函数也可以再前面使用. 不过,项目中看到过这样的写法 var a = function(){}, b = function(){}; 这种写法使代码看上去 ...

  3. 理解 Delphi 的类(十) - 深入方法[17] - 提前声明

    //要点17: 如果前面的方法要调用后面的方法, 后面的方法需要提前声明 function MyFunB(x: Integer): Integer; forward; {使用 forward 指示字提 ...

  4. 详解js变量声明提升

    之前一直觉会认为javascript代码执行是由上到下一行行执行的.自从看了<你不知道的JS>后发现这个观点并不完全正确.先来给大家举一个书本上的的例子: var a='hello wor ...

  5. js函数声明外面使用小括号括起来再接一个小括号的写法

    js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...

  6. JavaScript学习系列博客_21_JavaScript 变量、函数的提前声明

    变量的提前声明(全局作用域) - 我们知道js的代码是自上而下执行的.如下,console.log(a)在var a=10前面,但是结果输出的是undefined. - 使用var关键字声明的变量,会 ...

  7. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  8. (转载)javascript函数作用域和提前声明

    http://www.cnblogs.com/ArthurPatten/p/3274080.html 一些语言如C.java都有块级作用域,即花括号内的每一段代码都具有各自的作用域,而且变量在声明它们 ...

  9. javascript函数作用域和提前声明

    一些语言如C.java都有块级作用域,即花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的,但是javascript没有块级作用域.javascript使用函数作用域,即 ...

随机推荐

  1. MPI初学-安装及OpenMPI函数说明

    一.Mac下OpenMPI的安装 所用电脑:MacBook Pro,OSX 10.11.2 从openmpi官网下载相应版本:OpenMPI 1.8下载 解压文件 双击解压或者tar zxvf ope ...

  2. 使用Flex4的PopUpManager的addPopUp() 方法弹出 removeChild异常的解决办法

    Flex4中,弹出窗口有两种: Alert.show("balabalabala-");   PopUpManager.addPopUp([要弹出的控件],[父控件],[是否模态] ...

  3. java事务管理

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  4. 感受机房管理化繁为简-新款KVM使用心得

    感受机房管理化繁为简-新款KVM使用心得 一. 背景 随着网络应用的不断增多,各地机房服务器数量也随之增加,利用多传统主机切换器的方式已经无法满足目前这种区域广.设备多人员紧缺的现状,而且即使是使用了 ...

  5. Duilib学习笔记《06》— 窗体基类WindowImpBase

    在前面的例子中我们发现,窗口都是继承CWindowWnd.INotifyUI,然后重载相关函数去实现.显然,我们发现窗口的创建流程实际上都是差不多的,主要只是在OnCreate加载的配置文件不同等等… ...

  6. WP8__实现ListBox横向滑动及子项绑定图片等控件

    <!--实现绑定的图片等信息 ListBox水平滚动--> <Grid> <Grid.Resources> <Style x:Key="horizo ...

  7. dig out secrets beneath AirSig

    My sister installed AirSig last week. She is so exciting about this new techknology and she won't st ...

  8. systemctl

      旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自动启动 chkconfig - ...

  9. 十五、struts2中的拦截器(框架功能核心)

    十五.struts2中的拦截器(框架功能核心) 1.过滤器VS拦截器 功能是一回事. 过滤器是Servlet规范中的技术,可以对请求和响应进行过滤. 拦截器是Struts2框架中的技术,实现AOP(面 ...

  10. OpenJudge 2809 计算2的N次方

    1.链接地址: http://bailian.openjudge.cn/practice/2809/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 任意给定一个正整数N(N ...