day06(2017.10.9)

一、变量声明提升

引擎解释javascript代码的之前会对其进行编译。在编译过程中会查找所有声明,并用合适作用域将他们关联起来。换句话说,在代码执行之前,会对作用域链中所有变量和函数声明先处理完先。所以,当遇到var a='hello world'中是 var a是先在编译阶段执行,然后在执行a='hello world'。

百度

var a = "hello world";
var a;
console.log(a);  //输出结果是“hello world”
console.log(a);  //输出结果是“undefined”
var a = "hello world";
第一段代码实质上是:
var a;
a='hello world';
console.log(a);  //输出“hello world”
总结一句话就是:只有声明被提升,而赋值或其他运算会留在原地。所以第二段代码实际上就是:
var a;
console.log(a);   //输出结果是“undefined”
a='hello world';

二、函数声明提升

函数两种创建方式
1.函数声明
fn('hello world');   //输出“hello world”
function fn(name){
    console.log(name);
}
2.函数表达式
fn('hello world');
var fn= function(name){
    console.log(name);
}
运行上面的代码,会报错Uncaught ReferenceError: fn is not defined(…),错误信息显示说fn没有被定义。
总结一句话就是:函数声明提升,函数声明语句将会被提升到外部脚本或者外部函数作用域的顶部(跟变量提升非常类似)。
案例:
var getName = function(){
    console.log(2);
}
function getName (){
    console.log(1);
}
getName();

函数声明function getName(){}的声明会被提前到顶部。而函数表达式var getName = function(){}则表现出变量声明提升。
因此在这种情况下,getName也是一个变量,因此这个变量的声明也将提升到底部,而变量的赋值依然保留在原来的位置。
因此上面的函数可以转换成下面的样子:

var getName;    //变量声明提升
function getName(){    //函数声明提升到顶部
    console.log(1);
}
getName = function(){    //变量赋值依然保留在原来的位置
    console.log(2);
}
getName();    // 最终输出:2

三、内置对象、本地对象、宿主对象

1、宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序
如:web浏览器,一些桌面应用系统等。即由web浏览器或是这些桌面应用系统造就的环境即宿主环境
2、本地对象:ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
“本地对象”包含哪些内容:
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、
EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
由此可以看出,简单来说,本地对象就是 ECMA-262 定义的类(引用类型)
3、内置对象:ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、
独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”
ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
4.宿主对象:由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。
5.自定义对象
总结:JS中,可以将对象分为“内部对象”、“宿主对象”和“自定义对象”三种
1,内部对象
js中的内部对象包括Array、Boolean、Date、Function、Global、Math、Number、Object、
RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、
SyntaxError和TypeError。
其中Global和Math这两个对象又被称为“内置对象”,这两个对象在脚本程序初始化时被创建,不必实例化这两个对象
2.宿主对象
宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是
浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。
不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。
浏览器对象有很多,如Window和Document等等。
3.自定义对象
顾名思义,就是开发人员自己定义的对象。JS允许使用自定义对象,使JS应用及功能得到扩充

你可能感兴趣的:(day06(2017.10.9))