做用域: js没有块做用域,只有函数做用域javascript
做用域链: 按序检索对象列表java
自执行函数:拥有私有做用域数组
匿名函数:this -> window函数
初始化: 全局对象, 执行环境栈, 全局执行环境this
类数组(伪数组): 可像数组索引,有length属性,可是没有数组的方法,实际上是个对象spa
例: arguments是一个object对象prototype
Array.prototype.slice.call(arguments, 0)是用来将arguments变量转换为真正的数组.code
Arguments的属性callee都会指向当前的被调函数.(可用于递归匿名函数)对象
[1] callee与caller递归
caller返回一个函数的引用,这个函数调用了当前的函数;
使用这个属性要注意:
1. 这个属性只有当函数在执行时才有用
2. 若是在javascript程序中,函数是由顶层调用的,则返回null
var a = function() {
alert(a.caller);
}
var b = function() {
a();
}
b(); // var b = function() { a(); }
预编译: 声明提早(hoisting)
1)函数声明会置顶
2)变量声明也会置顶
3)函数声明 > 变量声明
4)变量和赋值语句一块儿书写,在js引擎解析时,会将其拆成声明和赋值2部分,声明置顶,赋值保留在原来位置
5)声明过的变量不会重复声明
同一个标识符的状况下,变量声明与函数声明都会提高;函数声明会覆盖变量声明,但不会覆盖变量赋值,即:若是声明变量的同时初始化或赋值,
那么变量优先级高于函数。
*屡次声明变量,只取最后值
函数表达式
(1) 要清楚二者的区别:
(function {// code})是表达式, function {// code}是函数声明.
(2) js"预编译"的特色:
js在"预编译"阶段, 会解释函数声明, 但却会忽略表式.
(3) 当js执行到function() {//code}();时, 因为function() {//code}在"预编译"阶段已经被解释过,
js会跳过function(){//code}, 试图去执行(), 故会报错;
当js执行到(function {// code})();时, 因为(function {// code})是表达式, js会去对它求解获得返回值,
因为返回值是一 个函数, 故而遇到();时, 便会被执行.
(4) 函数转换为表达式的方法并不必定要靠分组操做符(),咱们还能够用void操做符,~操做符,!操做符……
如:!function(){ alert("另类的匿名函数自执行"); }();