注:《JavaScript核心概念》适合深入了解JavaScript,比我买的《JavaScript框架设计》语言和内容丰富多了(可能是我水平尚浅吧)。

1. 作用域

var herp=”one”;
{
var herp=”two”;
}
alert(herp); //two,

上面这个很简单,那看看下面这两个。

//代码1
var str="global";
function scopteTest(){
alert(str); //
str="local";
alert(str); //
}

这里1和2会输出什么呢?

//代码2
var str="global";
function scopteTest(){
alert(str); //3
var str="local";
alert(str); //4
}

这里3和4又会输出什么呢?

答案:1、2、3、4分别输出

global
local
undefined
local

很神奇吧,尤其是第三个,详情去看《JavaScript核心概念》吧。

大致原理:JavaScript的作用域是词法作用域。在代码2中,词法分析结束后,str变量 已经加入到 scopteTest函数局部作用域了,即整个函数内部已经知道自己内部有个 str,当然就不再去访问 外部的 str了。但由于 //3 处于 变量的 定义 之前,所以 会输出 undefined。

2. 经典的闭包例子

//例子1
var outter=[];
function closureTest(){
var array=["one","two","three","four"];
for(var i=0; i<array.length; i++){
var x={};
x.no = i;
x.text = array[i];
x.invoke = function( i ){
print(i);
};
outter.push(x); }
} closureTest();
print(outter[0].invoke());
print(outter[1].invoke());
print(outter[2].invoke());
print(outter[3].invoke());
//例子2
var outter=[];
function closureTest(){
var array=["one","two","three","four"];
for(var i=0; i<array.length; i++){
var x={};
x.no = i;
x.text = array[i];
x.invoke = function( no ){
return function(){
print(no);
}
}(i);
outter.push(x); }
} closureTest();
print(outter[0].invoke());
print(outter[1].invoke());
print(outter[2].invoke());
print(outter[3].invoke());

例子1输出:

4
4
4
4

例子2输出:

0
1
2
3

3. JavaScript函数的创建

创建JavaScript函数的一种不长用的方式(几乎没有人用)是通过new操作符来作用于Function“构造器”:

var funcName = new Function( [argname1, [... argnameN,]] body );  

参数列表中可以有任意多的参数,然后紧跟着是函数体,比如:

var add = new Function("x", "y", "return(x+y)"); print(add(2, 4));

但更常用的是通过字面量来创建函数:

function add(x, y){  return x + y; }

4. new 一个函数的实质过程

在JavaScript中,通过 new 操作符,来作用一个函数,实质过程是这样的:

  首先,创建一个空对象,然后用函数的 apply 方法,将这个空对象传入作为 apply 的第一个参数,及上下文参数。这样函数内部的this将会被这个空对象所替代。

  例如:

var triangle = new Shape("triangle");
//相当于下面:
var triangle = {};
Shape.apply(triangle, ["triangle"]);

《JavaScript核心概念》基础部分重点摘录的更多相关文章

  1. javascript 核心概念(1)-数据类型

    语法 (1)到现在为止,大多数浏览器也还是支持到ECMAScript 第三版的标准. 核心概念就是一个语言的基本工作原理,涉及语法,操作符,数据类型. (2)javascript的一切--变量,函数名 ...

  2. javascript核心概念之——数组

    在javascript中数组就是一个可以存放任何类型的集合.存储在数组中的值用逗号分隔 var arr = ["hello",7,null,undifined,obj,undifi ...

  3. javascript核心概念——new

    如果完全没有编程经验的朋友看到这个词会想到什么? 上过幼儿园的都知道new表示 "新的" 的意思. var a = new Date() 按照字面的意思表示什么? 把一个新的dat ...

  4. 掌握 javascript 核心概念 最好的教程 系列 之一

    链接 新链接 函数优先, 在扫描创建变量阶段, 会先收集函数, 如果前面有同名函数或者变量, 这个新函数会覆盖前面同名的: 而如果这时候是变量, 则不能去覆盖前面已有的值. function test ...

  5. Javascript本质第一篇:核心概念

    很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...

  6. 学习 JavaScript (三)核心概念:语法、变量、数据类型

    JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,这篇文章主要讲解的是前面三个,后面三个下一篇文章再讲解. 01 语法 熟悉 JavaScript 历史的人应该都知道 ...

  7. JavaScript编程:javaScript核心基础语法

    1.javaScript核心基础语法: javaScript技术体系包含了5个内容:          1.核心语言定义:          2.原生对象和雷子对象:          3.浏览器对象 ...

  8. 学习 JavaScript (四)核心概念:操作符

    JavaScript 的核心概念主要由语法.变量.数据类型.操作符.语句.函数组成,前面三个上一篇文章已经讲解完了.后面三个内容超级多,这篇文章主要讲解的是操作符. 操作符 什么叫做操作符? 这是一种 ...

  9. 2.基础:Vue组件的核心概念

    一.组件基础和注册 组件概念 组件系统是 Vue 的另一个重要概念,他的核心就是封装和复用. 细节 组件的name必须是全局唯一. 二.属性.事件和插槽 组件的三大核心概念:属性.事件和插槽. 属性, ...

随机推荐

  1. Java SE (6)之 多线程

    package com.sunzhiyan03; /* * 演示多线程 * */ public class Demo3 { public Demo3() { // TODO Auto-generate ...

  2. Asp.net: WebForm基础上构建Mvc的方法

    添加引用: System.Web.Routing System.Web.Abstractions System.Web.Mvc 添加文件夹: Controllers, Views,  Views / ...

  3. SQL server 跨库插入数据

    1.INSERT INTO SELECT语句 语句形式为: Insert into Table2(field1,field2,...) select value1,value2,... from Ta ...

  4. eclipse总是自动跳到ThreadPoolExecutor.java

    解决方法:在eclipse中选择Window->Preference->Java->Debug, 将“Suspend execution on uncaught exceptions ...

  5. Exercise DS

    #include <iostream> using namespace std; typedef struct Node { Node *next; int data; }Node, *L ...

  6. Java之网络请求工具类(依赖:org.apache.http;注:HttpClient 4.4,HttpCore 4.4)

    到此处可以去下载依赖包:http://hc.apache.org/downloads.cgi import java.util.List; import org.apache.http.HttpSta ...

  7. 修正constructor的指向

    function Aaa(){ } //Aaa.prototype.constructor = Aaa;   //每一个函数都会有的,都是自动生成的 Aaa.prototype.name = '小明' ...

  8. 怎样制作PHP验证码?

    <?php /** *制作验证码 *1.启动session *2.设定标头 *3.创建画布 *4.创建颜色 *5.创建随机数并放到画布上 *6.将得到的若干随机数放入session中 *7.添加 ...

  9. Hierarchy Viewr 配合 adb 命令 查看窗口属性

    Hierarchy Viewr 可以看到当前 的 窗口层次如下

  10. smali 语法之try catch语句

    # virtual methods .method public onClick(Landroid/view/View;)V .locals 4 .parameter "v" .p ...