Skip to content

JavaScript Sharing part 1

Michael Huang edited this page Mar 20, 2015 · 2 revisions

简单介绍:
1.前端工程师:
HTML:
CSS:
javascript:

2.javascript的跨平台
也可以说“平台= CPU+OS”。又因为现在主流的操作系统都支持主流的CPU,所以有时也把操作系统称为平台。
我们说的语言跨平台是编译后的文件跨平台,而不是源程序跨平台。
比如windows可以使用VC编译,那编译后的exe文件就可以在windows下运行;liunx下可以使用GCC编译,生成的可执行文件就可以在Liunx上运行。

js 规范 ecma script 3 , 5

3.客户端 js

4.服务器端 js
http://www.infoq.com/cn/articles/what-is-nodejs/

Node.js不是JS应用、而是JS运行平台
Node.js采用C++语言编写而成,是一个Javascript的运行环境。
他最初希望采用Ruby来写Node.js,但是后来发现Ruby虚拟机的性能不能满足他的要求,后来他尝试采用V8引擎,所以选择了C++语言。
这意味着你可以编写系统级或者服务器端的Javascript代码,交给Node.js来解释执行。
Node.js采用了Google Chrome浏览器的V8引擎,性能很好,同时还提供了很多系统级的API,如文件操作、网络编程等。
浏览器端的Javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限。
Node.js采用事件驱动、异步编程,为网络服务而设计。
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {’Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(80, “127.0.0.1”);

Node.js在设计上也是比较大胆,它以单进程、单线程模式运行(很吃惊,对吧?这和Javascript的运行方式一致)

undefined
null

boolean
string
number
array
obj

主题:
1. obj and function
2. function expression and fucntion declaration.
3. ac vo/ao , scope chain, this binding
4. function create , invoke ,prepare to execute, execute
5. bind call apply

activeExecutionContext = {
VO: {…},
this: thisValue
};

VO !!!!!!!!!!!!!!!!!!!
全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象;
这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。

VO === global;

VO === AO;
变量 (var, 变量声明);
函数声明 (FunctionDeclaration, 缩写为FD);
函数的形参

函数的所有形参(如果我们是在函数执行上下文中) — 由名称和对应值组成的一个变量对象的属性被创建;没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也将被创建。 所有函数声明(FunctionDeclaration, FD) —由名称和对应值(函数对象(function-object))组成一个变量对象的属性被创建;如果变量对象已经存在相同名称的属性,则完全替换这个属性。 所有变量声明(var, VariableDeclaration) — 由名称和对应值(undefined)组成一个变量对象的属性被创建;如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的这类属性。 *进入执行上下文 *执行代码

经典例子1:
alert(x); // function
var x = 10;
alert(x); // 10
x = 20;
function x() {};
alert(x); // 20

经典例子2:
if (true) {
var a = 1;
} else {
var b = 2;
}

alert(a); // 1
alert(b); // undefined,不是b没有声明,而是b的值是undefined

经典例子3:
alert(a); // undefined
alert(b); // “b” 没有声明

b = 10;
var a = 20;

当前ECMAScript规范指出独立作用域只能通过“函数(function)”代码类型的执行上下文创建,
ECMAScript里的for循环并不能创建一个局部的上下文

变量相对于简单属性来说,变量有一个特性(attribute):{DontDelete}

this!!!!!!!!!!!!!!!!!!!!
全局代码中的this:
this.a = 10; // global.a = 10
alert(a); // 10
// 通过赋值给一个无标示符隐式
b = 20;
alert(this.b); // 20
// 也是通过变量声明隐式声明的
// 因为全局上下文的变量对象是全局对象自身
var c = 30;
alert(this.c); // 30

函数代码中的this:
正如我们上面曾提到的那样,this是进入上下文时确定,在一个函数代码中,这个值在每一次完全不同.
不管怎样,在代码运行时的this值是不变的.

在通常的函数调用中,this是由激活上下文代码的调用者来提供的,即调用函数的父上下文(parent context )。this取决于调用函数的方式。

经典例子1:
function foo() {
alert(this);
}
foo(); // global
alert(foo === foo.prototype.constructor); // true
// 但是同一个function的不同的调用表达式,this是不同的
foo.prototype.constructor(); // foo.prototype

引用类型(Reference type)
var valueOfReferenceType = {
base: ,
propertyName:
};

1.当我们处理一个标示符时
2.或一个属性访问器


在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。
如果调用括号()的左边是引用类型的值,this将设为引用类型值的base对象(base object),
在其他情况下(与引用类型不同的任何其它属性),这个值为null。
不过,实际不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象。
注:第5版的ECMAScript中,已经不强迫转换成全局变量了,而是赋值为undefined。
********************************************************

标识符 是变量名,函数名,函数参数名和全局对象中未识别的属性名。
var foo = 10;
function bar() {}

var fooReference = {
base: global,
propertyName: ‘foo’
};

var barReference = {
base: global,
propertyName: ‘bar’
};

属性访问器 都应该熟悉。它有两种变体:点(.)语法(此时属性名是正确的标示符,且事先知道),或括号语法([])

var foo = {
bar: function () {
alert(this);
alert(this === foo);
}
};

foo.bar();
foo[‘bar’]();

var fooBarReference = {
base: foo,
propertyName: ‘bar’
};


function foo() {
return this;
}

foo(); // global
我们看到在调用括号的左边是一个引用类型值(因为foo是一个标示符)。
var fooReference = {
base: global,
propertyName: ‘foo’
};
-———————————-
同样,使用属性访问器:
var foo = {
bar: function () {
return this;
}
};

foo.bar(); // foo
我们再次拥有一个引用类型,其base是foo对象,在函数bar激活时用作this。
var fooBarReference = {
base: foo,
propertyName: ‘bar’
};


更多复杂例子
1.
(function () {
alert(this); // null => global
})();

var foo = {
bar: function () {
alert(this);
}
};

foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo

(foo.bar = foo.bar)(); // global?
(false || foo.bar)(); // global?
(foo.bar, foo.bar)(); // global?

2. 当引用类型值的base对象是被活动对象时
function foo() {
function bar() {
alert(this); // global
}
bar(); // the same as AO.bar()
}
3.with statement
************************************************************
作为构造器调用的函数中的this

手动设置 this

call apply bind .

Clone this wiki locally