软件工程学习笔记

#Javascript学习笔记-进阶

##BOM
BOM(Browser Object Model)浏览器对象模型。

window对象是BOM的顶层(核心)对象。

windows的子对象:frames[]、history、location、navigator、screen、document。

由于window是顶层对象,因此调用它的子对象或方法(如setTimeout)时可以不显示的指明window对象。

JavaScript中的任何一个全局函数或全局变量都是window的属性。

var foo = "hello";
 
document.writeln(foo); // "hello"
document.writeln(window.foo); // "hello"
document.writeln(window["foo"]); // "hello"
document.writeln(this.foo); // "hello"

每个JavaScript环境有一个全局对象,当你在任意的函数外面使用this的时候可以访问到。

JavaScript有隐含的全局概念,意味着你不声明的任何变量都会成为一个全局对象属性
##DOM
DOM(Document Object Model,文档对象模型)。

##预编译
JavaScript在解释执行前,会进行一次“预编译”。

一、先预定义用var声明的变量,把这些变量设置为活动对象的属性。然后再预定义以function定义的函数,将这些函数也添加为活动对象的属性,而且他们的值正是函数的定义。

二、变量的预编译只作声明,不作初始化,初始化在执行时。

三、function语句定义的函数,不仅声明了函数名,而且函数体也进行了处理。

四、匿名函数不会预编译。

 
function f() { // 普通函数
return 1;
}
alert(f()); // 返回1
var f = function() { // 匿名函数
return 2;
}
alert(f()); // 返回2

先预定义了变量f,然后同名函数f()覆盖了变量f,所以输出1

var f = function() { // 匿名函数
return 1;
}
alert(f()); // 返回1
function f() { // 普通函数
return 2;
}
alert(f()); // 返回1

先预定义了变量f,然后同名函数f()覆盖了变量f。

f();
function f() {
alert('a');
}

因为预编译的原因,函数f的使用能放在其定义的前面。

var foo = "hello";
 
document.writeln(foo); // "hello"
document.writeln(window.foo); // "hello"
document.writeln(window["foo"]); // "hello"
document.writeln(this.foo); // "hello"

这里的函数f是匿名函数,不会预编译。

alert(a); // undefined
var a = 1;
var name = "全局";
function getName() {
	var name = "局部";
	document.writeln(this.name); // 全局
};
 getName();

##作用域
开发进阶:理解 JavaScript 作用域和作用域链

Javascript的作用域和Java是差不多,但因为Javascript预编译的特殊,导致很容易出错。

var a = 'aa';
fun();
function fun() {
document.writeln(a); // undefined
var a = 'aaa';
};

##This
总结:this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象。
在函数里面,this 通常是一个隐含的参数。 在函数外(顶级作用域中),this 指的是全局对象(window对象)。

var name = "全局";
function getName() {
var name = "局部";
document.writeln(this.name); // 全局
};
getName();
var name = '全局';
var obj = {
name: '局部',
getName: function () {
var name = "";
document.writeln(this.name); // 全局
}
};
obj.getName();`

##闭包(closure)
闭包是指有权访问另外一个函数作用域中的变量的函数。创建闭包的常见方式就是在一个函数内部创建另外一个函数。

简而言之:所谓闭包就是在一个函数内部创建另一个函数,且内部函数访问了外部的变量。

滥用闭包会造成内存的大量消耗。

##柯里化(currying)

posted @ 2016-01-15 21:42  yunser_blog  阅读(105)  评论(0)    收藏  举报