以图明志

JavaScript

[专题] JavaScript探秘:命名函数表达式替代方案

在函数内部声明一个函数
其实,如果我们不想要这个描述性名字的话,我们就可以用最简单的形式来做,也就是在函数内部声明一个函数(而不是函数表达式)。显然,当存在多个分支函数定义时,这个方案就不行了。不过有种模式貌似可以实现:那就是提前使用函数声明来定义所有函数,并分别为这些函数指定不同的标识符。

JavaScript

[专题] JavaScript探秘:对象Object

js是一门高度抽象的面向对象语言
ECMAScript是一门高度抽象的面向对象(object-oriented)语言,用以处理Objects对象。当然,也有基本类型,但是必要时,也需要转换成object对象来用。首先我们要清楚,一个Object的prototype是一个内部的[[prototype]]属性的引用。

JavaScript

[专题] JavaScript探秘:原型链 Prototype chain

一个原型对象的原型不为null的话
原型对象也是普通的对象,并且也有可能有自己的原型,如果一个原型对象的原型不为null的话,我们就称之为原型链(prototype chain)。想象一个这种情况,2个对象,大部分内容都一样,只有一小部分不一样,很明显,在一个好的设计模式中,我们会需要重用那部分相同的,而不是在每个对象中重复定义那些相同的方法或者属性。

JavaScript

[专题] JavaScript探秘:构造函数 Constructor

自动为创建的新对象设置了原型对象
除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object) 。原型对象存放于 ConstructorFunction.prototype 属性中。每一个object都有一个prototype. 构造函数Foo也拥有自己的__proto__, 也就是Function.prototype。

JavaScript

[专题] JavaScript探秘:可执行的上下文堆栈

执行上下文栈(Execution Context Stack)
在ECMASscript中的代码有三种类型:global, function和eval。每一种代码的执行都需要依赖自身的上下文。当然global的上下文可能涵盖了很多的function和eval的实例。函数的每一次调用,都会进入函数执行中的上下文,并且来计算函数中变量等的值。eval函数的每一次执行,也会进入eval执行中的上下文,判断应该从何处获取变量的值。

JavaScript

[专题] 执行上下文其一:变量对象与活动对象

Variable Object / activation object
变量对象(Variable Object)是一个抽象的概念,不同的上下文中,它表示使用不同的object。例如,在global全局上下文中,变量对象也是全局对象自身[global object]。当函数被调用者激活,这个特殊的活动对象(activation object) 就被创建了。

JavaScript

[专题] 执行上下文其二:作用域链 Scope Chains

作用域链的原理和原型链很类似
作用域链的原理和原型链很类似,如果这个变量在自己的作用域中没有,那么它会寻找父级的,直到最顶层。标示符[Identifiers]可以理解为变量名称、函数声明和普通参数。例如,当一个函数在自身函数体内需要引用一个变量,但是这个变量并没有在函数内部声明(或者也不是某个参数名),那么这个变量就可以称为自由变量[free variable]。

JavaScript

[专题] 执行上下文其三:闭包 Closures

理论上ECMAScript中所有函数都是闭包
在ECMAScript中,函数是“第一类”对象。这个名词意味着函数可以作为参数被传递给其他函数使用 (在这种情况下,函数被称为“funargs”——“functional arguments”的缩写[译注:这里不知翻译为泛函参数是否恰当])。接收“funargs”的函数被称之为 高阶函数(higher-order functions) ,或者更接近数学概念的话,被称为 运算符(operators) 。

JavaScript

[专题] 执行上下文其四:This指针

任何对象都可以作为上下文的this值
任何对象都可以作为上下文的this值。我想再次澄清对与ECMAScript中,与执行上下文相关的一些描述——特别是this的误解。通常,this 被错误地,描述为变量对象的属性。这个特点很重要,因为和变量不同,this是没有一个类似搜寻变量的过程。当你在代码中使用了this,这个 this的值就直接从执行的上下文中获取了,而不会从作用域链中搜寻。

JavaScript

[专题] JavaScript探秘:强大的原型和原型链

JavaScript继承模型使用 prototypal 原型模型
JavaScript 不包含传统的类继承模型,而是使用 prototypal 原型模型。虽然这经常被当作是 JavaScript 的缺点被提及,其实基于原型的继承模型比传统的类继承还要强大。实现传统的类继承模型是很简单,但是实现 JavaScript 中的原型继承则要困难的多。

JavaScript

[专题] JavaScript函数其一:函数声明

主要特点在于它们仅仅影响变量对象
下面我们介绍的是一个非常常见的ECMAScript对象——函数(function),我们将详细讲解一下各种类型的函数是如何影响上下文的变量对象以及每个函数的作用域链都包含什么,以及回答诸如像下面这样的问题:下面声明的函数有什么区别么?(如果有,区别是什么)。

JavaScript

[专题] JavaScript函数其二:函数表达式

它在源码中总是处在表达式的位置
另外一种可以取代函数声明的方式是函数表达式,解释如下:在源码中须出现在表达式的位置,有可选的名称,不会影响变量对象,在代码执行阶段创建。这种函数类型的主要特点在于它在源码中总是处在表达式的位置。

JavaScript

[专题] JavaScript函数其三:分组中的函数表达式

函数创建后的调用中用圆括号来包住它
让我们回头并回答在文章开头提到的问题——”为何在函数创建后的立即调用中必须用圆括号来包围它?”,答案就是:表达式句子的限制就是这样的。按照标准,表达式语句不能以一个大括号{开始是因为他很难与代码块区分,同样,他也不能以函数关键字开始,因为很难与函数声明进行区分。

JavaScript

[专题] JavaScript函数其四:函数构造器

这种函数的[[Scope]]属性仅包含全局对象
既然这种函数对象也有自己的特色,我们将它与FD和FE区分开来。其主要特点在于这种函数的[[Scope]]属性仅包含全局对象。我们看到,函数bar的[[Scope]]属性不包含foo上下文的Ao——变量”y”不能访问,变量”x”从全局对象中取得。

JavaScript

[专题] JavaScript变量对象其一:VO的声明

一个与执行上下文相关的特殊对象
如果变量与执行上下文相关,那变量自己应该知道它的数据存储在哪里,并且知道如何访问。这种机制称为变量对象(variable object)。变量对象(缩写为VO)是一个与执行上下文相关的特殊对象,它存储着在上下文中声明的以下内容:变量 (var, 变量声明);函数声明 (FunctionDeclaration, 缩写为FD);函数的形参。

JavaScript

[专题] JavaScript变量对象其二:VO在不同的执行上下文中

不同执行上下文中的变量对象
对于所有类型的执行上下文来说,变量对象的一些操作(如变量初始化)和行为都是共通的。从这个角度来看,把变量对象作为抽象的基本事物来理解更为容易。同样在函数上下文中也定义和变量对象相关的额外内容。当访问全局对象的属性时通常会忽略掉前缀,这是因为全局对象是不能通过名称直接访问的。
3 / 4 首页 < Prev 1 2 3 4 Next > 尾页 页码: