注:《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. WPF Radio组的绑定

    都是控件编,RadioButtion 简单绑定使用,model.cs下边定义属性 private int _isSuccess; public int IsSuccess { get { return ...

  2. Linq 中的distinct去重

    Linq的Distinct和T-Sql的distinct一样,可以将重复的结果集去重注意: 1 distinct去重记录要求每个字段都重复时,才算重复对象,这与sql一样2 distinct语句可以和 ...

  3. c#基础-----数据类型,转义字符,引用类型,类型转换

    数据类型,转义字符,引用类型,类型转换 百度一下

  4. CSS 链接

    不同的链接可以有不同的样式. 链接样式 链接的样式,可以用任何CSS属性(如颜色,字体,背景等). 特别的链接,可以有不同的样式,这取决于他们是什么状态. 这四个链接状态是: a:link - 正常, ...

  5. css文件加载:@import和link的区别

    刚看了一个百度试题:请简述CSS加载方式link和@import的区别? 平时一般都用link,也知道css的加载方式,但还真的没有仔细研究过其之间的差别,查了一些资料,大致总结如下: @impot使 ...

  6. [LeetCode OJ] Largest Rectangle in Histogram

    Given n non-negative integers representing the histogram's bar height where the width of each bar is ...

  7. Codeforces 551D GukiZ and Binary Operations(矩阵快速幂)

    Problem D. GukiZ and Binary Operations Solution 一位一位考虑,就是求一个二进制序列有连续的1的种类数和没有连续的1的种类数. 没有连续的1的二进制序列的 ...

  8. 实现基于Memcache存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 使用基于文件的Session存取瓶颈可能都是在 ...

  9. 『重构--改善既有代码的设计』读书笔记----Change Reference to Value

    如果你有一个引用对象,很小且不可改变,而且不易管理,你就需要考虑将他改为一个值对象.在Change Value to Reference我们说过,要在引用对象和值对象之间做选择,有时候并不容易,有了重 ...

  10. python细节

    1.assert 断言语句,可判断一句话真假,若为假会抛出AssertionError. eg. assert 1==1     assert 1==2则AssertionError 2.单引号双引号 ...