你真的了解javascript吗
原文地址: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>
};
它包括如下属性:
- callee — 指向当前函数的引用
- length — 真正传递的参数个数
- properties-indexes (字符串类型的整数) 属性的值就是函数的参数值(按参数列表从左到右排列)。 properties-indexes内部元素的个数等于arguments.length. properties-indexes 的值和实际传递进来的参数之间是共享的。
#demo5
function a() {
alert(this);
}
a.call(null);//[object window]
不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象
你真的了解javascript吗的更多相关文章
- 我真的知道JavaScript吗?
JavaScript 说说JavaScript 接触JavaScript时间其实已经不短了,之前一直是半瓶酱油,东凑西凑的收集相关的知识.并没有完整系统的学习过JavaScript,觉得JavaScr ...
- JavaScript内部原理实践——真的懂JavaScript吗?(转)
通过翻译了Dmitry A.Soshnikov的关于ECMAScript-262-3 JavaScript内部原理的文章, 从理论角度对JavaScript中部分特性的内部工作机制有了一定的了解. 但 ...
- 你真的懂javascript中的 “this” 吗?
一.前言: 我们知道 "this" 是javascript语言的一个关键字,在编写javascript代码的时候,经常会见到或者用到它. 但是,有一部分开发朋友,对 "t ...
- 你真的懂JavaScript基础类型吗
夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...
- 【前端知识体系-JS相关】你真的了解JavaScript编译解析的流程吗?
1. JS编译解析的流程 1.1 JS运行分三步 语法分析(通篇扫描是否有语法错误),预编译(发生在函数执行的前一刻),解释执行(一行行执行). 1.2 预编译执行分五步 创建AO对象(Activat ...
- 你必须知道的Javascript 系列
JavaScript是见过最多人说它“有趣”,“好玩”的一门语言.不仅仅是因为它的灵活性,包括它本身很多的特性,比如说原型链,作用域链都是非常好玩的东西.现在已经有很多的JavaScript设计模式, ...
- 图解JavaScript执行环境结构
JavaScript引擎在开始编译代码的时候,会对JavaScript代码进行一次预编译,生成一个执行环境,比如如下代码: window.onload=function(){ function sub ...
- 浅析JavaScript引用类型之--Object、Array
1.Object类型 对象是某个特定引用类型的实例,新对象有两种创建方式: i.使用new操作符调用构造函数来创建. var person = new Object(); person.name = ...
- 【翻译】Zakas解答Baranovskiy的JavaScript测验题
原文:http://www.nczonline.net/blog/2010/01/26/answering-baranovskiys-javascript-quiz/ ---------------- ...
随机推荐
- javascript函数sort
sort函数用于对数组的元素进行排序 语法:arrayObject.sort(sortby); 参数sortby可选,规定排序顺序,必须是函数. 如果调用该方法时没有使用参数,将按照字幕顺序进行排序, ...
- CreateProcess error=206, The filename or extension is too long"的一个解决方案
在实际项目中我使用antrun 和 closure-compiler压缩JS项目.然后我就使用如下代码: 首先加入依赖. <dependency> <groupId>com.g ...
- 使用Log.isLoggable方法
在Audio Debug过程中想打开AudioService.java文件中的log,比如想打开setmode这段log: if (DEBUG_MODE) { Log.v(TAG, "set ...
- Office2016 转换零售版为VOL版
@echo off :ADMIN openfiles >nul >nul ||( echo Set UAC = CreateObject^("Shell.Application& ...
- Flex SDK包内文件夹内容说明
打开SDK目录,让我们看看SDK中都包含了哪些内容: ant包含Flex对Ant的支持库,JAR和Java源码都有,方便我们基于Ant完成对项目的构建 asdoc基于ASDOC我们可以很方便的生成代码 ...
- share-jquery
html val text区别: .html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值. 这三个方法功能上的对 ...
- delphi 2010 导出sql server 数据到DBF乱码问题
近日,由于业务需要导出sql server 数据到DBF文件,要查询多表记录,并适当处理后生成导出DBF文件,系统使用delphi2010平台开发. 首先按要求在VFP里创建DBF表,字段数有240个 ...
- 【转】MySQL索引和查询优化
原文链接:http://www.cnblogs.com/mailingfeng/archive/2012/09/26/2704344.html 对于任何DBMS,索引都是进行优化的最主要的因素.对于少 ...
- delphi 集合
DELPHI没有JAVA的丰富的集合(SET MAP LIST),只有Tlist,可包装各种类型
- Shell 脚本基本操作练习
这里主要是熟悉了shell的基本操作,包括变量赋值引用修改.函数的使用.信号的获取及一些判断方法等,具体详见代码: #!/bin/sh str="Hello World !" ec ...