问题一、
难度系数: ★★★★
相关技术点:
1). 引用变量赋值
2). 内存分析
3). 函数调用传参
4). 运算符的优先级
预热1.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01_百度</title>
</head>
<body>
<script type="text/javascript">
// 预热一
var obj = {n: 1} //new 一个对象,属性是n=1
var obj2 = obj //obj 赋值给 Obj2
obj2.n = 2 //2 赋值给 obj2 的 n 属性
console.log(obj.n) // ? obj.n 为 2
</script>
</body>
</html>
答案:2
预热2
// 预热二
function fn1(a) { //函数传递对象 a
a.n = 3 // a 的 n属性赋值为3
}
fn1(obj) // fn1接收 obj
console.log(obj.n) // ? obj 的 n属性
答案:n=3 (函数 a 将 n的值改为3)
预热3
// 预热三
function fn2(a) {
a = {n:4} //将对象赋值给 a
}
fn2(obj) fn2接收 obj(但并没有改变obj的值)
console.log(obj.n) // ?
答案:n=3(并没有改变obj的值)
正式题目
var a = {n: 1} //定义一个对象属性n=1赋值给变量 a
var b = a //将变量a 赋值给 变量b
a.x = a = {n: 2} //1.连续赋值从右向左 2.a.x的优先级比=更高,故向其中添加变量x
console.log(a.n, b.n) // ? ?
console.log(a.x, b.x) // ? ?
1.
var a = {n: 1} //定义一个对象属性n=1赋值给变量 a
var b = a //将变量a 赋值给 变量b
a.x = a = {n: 2} //1.连续赋值从右向左 2.a.x的优先级比=更高,故向其中添加变量x
//将对象n=2赋值给变量a
console.log(a.n, b.n) // ? ?
console.log(a.x, b.x) // ? ?
2.
var a = {n: 1} //定义一个对象属性n=1赋值给变量 a
var b = a //将变量a 赋值给 变量b
a.x = a = {n: 2} //1.连续赋值从右向左 2.a.x的优先级比=更高,故向其中添加变量x
//将对象n=2赋值给变量a
//再将a赋值给 a.x
console.log(a.n, b.n) // ? ?
console.log(a.x, b.x) // ? ?
3.
综上,可知 console.log(a.n, b.n) // 2 1
console.log(a.x, b.x) // undefined 2(对象)
问题二
1. 难度系数: ★★★
2. 技术点:
1). 作用域与作用域链
2). 变量查找
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>02_腾讯1</title>
</head>
<body>
<script type="text/javascript">
var x = 10 //变量x=10
function fn() { //定义函数fn
console.log(x) //打印输出 x
}
function show(f) { //定义函数show 并接受参数 f
var x = 20 //变量x=20
f() //调用参数 f
}
show(fn) // ?
</script>
</body>
</html>
分析:
console.log(x) 输出x,但在当前作用域里面并没有 x ,会沿着作用域链查找,即在全局作用域中查找,故输出10
问题三
1. 难度系数: ★★★
2. 技术点:
1). 作用域与作用域链
2). 变量查找
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>03_美团1</title>
</head>
<body>
<script type="text/javascript">
var fn = function () {
console.log(fn)
}
fn() // ? function定义
var obj = {
fn2: function () {
console.log(fn2)
}
}
obj.fn2() // ? 报错
var obj = {
fn3: function () {
console.log(this.fn3) // obj.fn3也行, 但比较死
}
}
obj.fn3() // ? function 定义
</script>
</body>
</html>
1.fn() 输出:
首先生成全局作用域,在定义函数后生成函数作用域,在函数作用域中去找变量fn ,先在当前作用域中找,但并没有;
然后沿着作用域链去外部找,在外部正好有fn,其值是函数对象,所以输出的就是这个函数
2. obj.fn2() 输出
首先生成全局作用域,在定义函数后生成函数作用域,在函数作用域中去找变量fn2 ,先在当前作用域中找,但并没有;
然后沿着作用域链去外部找,外部全局变量也没有fn2,故报错未定义fn2
3. obj.fn3() 输出