原文地址:http://dmitry.baranovskiy.com/post/91403200

看了文章中五个小例子,写了写自己的理解

#demo1

if (!("a" in window)) {
var a = 1;
}
alert(a);

#demo1 主要用到javascript执行时候的预解析(变量声明提前),进入执行上下文的时候,解释器会把当前上下文中所有的函数声明、变量声明、函数形参提前,对象变量的状态大体如下:

var a; //等同于 var a = undefined;
if (!("a" in window)) { //if不会成立
a = 1;
}
alert(a);//undefined

#demo2

var a = 1,
b = function a(x) {
x && a(--x);
};
alert(a);//1

#demo2中,function a的定义采用函数表达式的方式,表达式的方式定义的function和声明式定义function最大的区别是函数表达式不会影响对象变量(VO),即不会对前面定义的变量a产生任何影响,a的调用会通过b这个引用来进行(a()可以在函数内部使用,递归或者内部执行)。比如引申一个demo:

function test(a, b) {
var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
} test(10); // call

test()执行的时候上下文对应的变量对象如下:

AO(test) = {
a: 10,
b: undefined,
c: undefined,
d: <reference to FunctionDeclaration "d">
e: undefined
};

可以看到,AO里并不包含函数“x”。这是因为“x” 是一个函数表达式(FunctionExpression, 缩写为 FE) 而不是函数声明,函数表达式不会影响VO。 不管怎样,函数“_e” 同样也是函数表达式,但是就像我们下面将看到的那样,因为它分配给了变量 “e”,所以它可以通过名称“e”来访问

#demo3

function a(x) {
return x * 2;
}
var a;
alert(a);//function a{…}

#demo3还是有关变量对象的组成,当函数被调用,进入执行上下文期间,解释器对变量对象的操作如下:

>1. 函数形参作为VO的key,对应的value是实参,没有实参初始化为undefined

2>.函数声明(不包括函数表达式), function 名作为key,值为对函数的引用,如果已存在相同名称的变量,则完全覆盖

3>.变量声明,key为变量名,值初始化为undefined,如果已存在相同名称的函数声明或者形参,则不会干扰这些已存在的属性

所以var a 不会对function a()产生影响

#demo4

function b(x, y, a) {
arguments[2] = 10;
alert(a);
}
b(1, 2, 3);//10

#demo4 还是对变量对象的考察,AO通过arguments初始化,arguments是AO的属性,

AO = {
arguments: <ArgO>
};

它包括如下属性:

  1. callee — 指向当前函数的引用
  2. length — 真正传递的参数个数
  3. properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的。

#demo5

function a() {
alert(this);
}
a.call(null);//[object window]

不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象

你真的了解javascript吗的更多相关文章

  1. 我真的知道JavaScript吗?

    JavaScript 说说JavaScript 接触JavaScript时间其实已经不短了,之前一直是半瓶酱油,东凑西凑的收集相关的知识.并没有完整系统的学习过JavaScript,觉得JavaScr ...

  2. JavaScript内部原理实践——真的懂JavaScript吗?(转)

    通过翻译了Dmitry A.Soshnikov的关于ECMAScript-262-3 JavaScript内部原理的文章, 从理论角度对JavaScript中部分特性的内部工作机制有了一定的了解. 但 ...

  3. 你真的懂javascript中的 “this” 吗?

    一.前言: 我们知道 "this" 是javascript语言的一个关键字,在编写javascript代码的时候,经常会见到或者用到它. 但是,有一部分开发朋友,对 "t ...

  4. 你真的懂JavaScript基础类型吗

    夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...

  5. 【前端知识体系-JS相关】你真的了解JavaScript编译解析的流程吗?

    1. JS编译解析的流程 1.1 JS运行分三步 语法分析(通篇扫描是否有语法错误),预编译(发生在函数执行的前一刻),解释执行(一行行执行). 1.2 预编译执行分五步 创建AO对象(Activat ...

  6. 你必须知道的Javascript 系列

    JavaScript是见过最多人说它“有趣”,“好玩”的一门语言.不仅仅是因为它的灵活性,包括它本身很多的特性,比如说原型链,作用域链都是非常好玩的东西.现在已经有很多的JavaScript设计模式, ...

  7. 图解JavaScript执行环境结构

    JavaScript引擎在开始编译代码的时候,会对JavaScript代码进行一次预编译,生成一个执行环境,比如如下代码: window.onload=function(){ function sub ...

  8. 浅析JavaScript引用类型之--Object、Array

    1.Object类型 对象是某个特定引用类型的实例,新对象有两种创建方式: i.使用new操作符调用构造函数来创建. var person = new Object(); person.name = ...

  9. 【翻译】Zakas解答Baranovskiy的JavaScript测验题

    原文:http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/ ---------------- ...

随机推荐

  1. CodeIgniter 3.0+ 部署linux环境 session报错

    codeigniter Message: mkdir(): Invalid path Filename: drivers/Session_files_driver.php 看起来像权限问题,在默认情况 ...

  2. WebService调用一对多关联关系时出现 死循环:A cycle is detected in...

    通过WebService调用一对多关联关系时引起的问题:A cycle is detected in the object graph 具体异常信息: org.apache.cxf.intercept ...

  3. Oracle 表空间修改字段大小

    1.修改字段大小 当表中已经存在数据,就不能直接修改某字段大小,需要新建一个字段来过渡   ALTER TABLE TABLE RENAME COLUMN GRP TO FUND_GRP_1; ); ...

  4. 为什么在Spring的配置里,最好不要配置xsd文件的版本号

    为什么dubbo启动没有问题? 原文链接:http://www.tuicool.com/articles/YRn67zM 这篇blog源于一个疑问: 我们公司使了阿里的dubbo,但是阿里的开源网站h ...

  5. JXTA+JavaFX实现的网络黑白棋测试地址

    http://www.qhdbaobao.com/dist/secondegg-reversi.html ——————————————————————————————————————————————— ...

  6. HDU 4618 Palindrome Sub-Array (2013多校2 1008 暴力)

    Palindrome Sub-Array Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Oth ...

  7. maven 部署到tomcat 的 resource问题

    1.maven resource结构 如图,我将resoures下建立四个子文件夹,base存放的是不随环境变化的配置项,而其他三个均是对应环境的配置文件. 2.问题 我执行maven命令是没有的,但 ...

  8. GWT+CodeTemplate+TableCreate快速开发

    刚进一家新公司,公司表示让我们几个新人写页面联系熟悉 怎么快速开发,进入正题: 1.根据设计规范设计页面excel 2.CodeTemplate根据excel生成属性类和对应方法(文本框,下拉框等等单 ...

  9. HDU3466Proud Merchants(贪心&背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=3466 题目大意是说n个物品每个物品的花费是p,但是如果你现在的钱少于q就买不了这个物品,每个物品的价值是v,求有 ...

  10. 分享一下jQuery UI的地址

    jQuery EasyUI: http://www.jeasyui.com/ DWZ: http://j-ui.com/ Liger UI: http://www.ligerui.com/ Liger ...