软件工程学习笔记
#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)

浙公网安备 33010602011771号