原文地址: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. 理解Python元类(转)

    add by zhj:先收藏了,有时间看,图倒是不少,可以配合stackover flow上那篇文章一起看 原文:http://blog.ionelmc.ro/2015/02/09/understan ...

  2. Codeforces Round #368 (Div. 2) B. Bakery (模拟)

    Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...

  3. 从Mac的Finder中访问你的iCloud文档

    [从Mac的Finder中访问你的iCloud文档] 从OS X 10.7.2开始,iCloud就深入Mac当中,我们也可以在Finder中访问储存在iCloud中的文件,甚至当你拥有多台Mac的时候 ...

  4. Tomcat 系统架构与设计模式,第 1 部分: 工作原理(转载)

    简介: 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomcat 如何分发请求.如何处理多用户同时请求,还有它的 ...

  5. 那些年困扰我们的委托(C#)

    委托这个东西不是很好理解,可是工作中又经常用到,你随处可以看到它的身影,真让人有一种又爱又恨的感觉,我相信许多人被它所困扰过. 一提到委托,如果你学过C语言,你一定会马上联想到函数指针. 什么是委托? ...

  6. android ViewConfiguration

    ViewConfiguration 1.有时候要获取一些android UI的中一些默认参数的来进行操作设置,就要用到ViewConfiguration 官方飞解释是:ViewConfiguratio ...

  7. Ubuntu创建launcher

    创建Launcher 以创建pycharm的launcher为例 创建文件pycharm.desktop 编辑该文件加入如下行: [Desktop Entry] Name=Pycharm #显示名称 ...

  8. Decode放在where条件后的新用法

    今天遇到一种特殊情况的查询,在查询某表时,要通过判断其中一个字段的值再用其他字段作为条件查询,比如有3个字段 columnA,columnBm,columnC,columnA的值由两个——分别是0和1 ...

  9. Oracle 数据库链接

    SQL> CREATE DATABASE LINK   mydblink 2    CONNECT TO   test   IDENTIFIED BY   test123 3    USING  ...

  10. c\c++ 字符串处理大集合[转]

    rember this strncpy(a,b,); a[]='\0'; ]; memset(a,'#',sizeof(a)); a[]='\0'; 刚开始学C/C++时,一直对字符串处理函数一知半解 ...