预编译阶段万能口诀
1.创建了ao对象
2. 找形参和变量的声明,作为AO对象的属性名,值是undefined
3. 实参和形参相统一
4. 找函数声明 会覆盖变量的声明
拓展:AO对象——函数作用域创建阶段,有一个与之对应的叫做JS的变量对象,在函数作用域创建阶段称为AO对象,供JS引擎自己去访问。
题目合集
function fn(a,c) {
console.log(a); //function a() {}
var a = 123;
console.log(a); //123
console.log(c); //function c() {}
function a() {}
if(false) {
var d = 678
}
console.log(d); //undefined
console.log(b); //undefined
var b = function(){} //函数表达式
console.log(b) //function(){}
function c() {} //函数声明
console.log(c) //function c() {}
}
fn(1,2)
/*** 预编译四步骤
AO:{
a: undefined 1 function a() {}
c: undefined 2 function c() {}
d: undefined
b: undefined
}
*/
//js的逐行执行
var b = 10;
(function b(){
b = 20;
console.log(b);
})();
/**
ƒ b(){
b = 20;
console.log(b);
}
*/
延伸:如何改造上面的代码,使之分别打印 10 和 20。
function changeObjProperty(o) {
o.siteUrl = "http://www.baidu.com"
o = new Object()
o.siteUrl = "http://www.google.com"
}
let webSite = new Object();
changeObjProperty(webSite);
console.log(webSite.siteUrl); //"http://www.baidu.com
传进函数的是原对象的地址(或者说引用),这个地址赋值给了形参(形参看做局部变量),形参变量此时指向原对象,后面o=new
object的时候,形参变量保存的是新对象的地址,指向的是新的对象,所以第二次的o.siteUrl
也是给这个新对象属性的赋值,和旧对象无关。最后打印website.SiteUrl
的时候,访问的是旧对象,因为前面的改动都只涉及到形参变量,和website无关,website依然保存着旧对象的引用。
其他
var a = {}
var b = 2
a[b] = 3
console.log(a) // { 2: 3 }
var a = {}
var b = [1,2]
a[b] = 3
console.log(a) //{1,2: 3}
var a = {}
var b = []
console.log(a) //{}
var a = {}
var b = {}
a[b] = 3
console.log(a) //{[object Object]: 3}
// example 1
var a={}, b='123', c=123;
a[b]='b';
a[c]='c';
console.log(a[b]); //c
---------------------
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');
a[b]='b';
a[c]='c';
console.log(a[b]); //b
---------------------
// example 3
var a={}, b={key:'123'}, c={key:'456'};
a[b]='b';
a[c]='c';
console.log(a[b]); //c
['10','10','10','10','10'].map(parseInt);
// [10, NaN, 2, 3, 4]