运算符的"诡异"现象
函数基础知识
普通函数调用时,this指向的是调用函数的对象
person.getName
getName
// 浏览器中执行 var nameVar = "nameVar"; let nameLet = "nameLet"; const nameConst = "nameConst"; console.log("nameVar:", window.nameVar); console.log("nameLet:", window.nameLet); console.log("nameConst:", window.nameConst);
(person.getName)()
有没有赋值操作?
赋值的话值给谁了?
分组运算符知识点
引用(协议内部的reference required)
内部引用类型不是语言数据类型
用于解释诸如delete、typeof 和赋值等操作符的行为
例如,赋值的左操作数应该产生一个引用记录。
赋值
var10 = 10; 10 = 10 // SyntaxError: Invalid left-hand side in assignment // { a: 1 } = { a: 1 }
引用相关的两个重要操作
GetValue(V)︰即取值操作,返回的是确定的值
PutValue(V,W):设置值,对某个引用设置, 将v赋值给w
PutValue要求第一个参数是引用(查看协议)
v=v
可以理解为︰ v = GetValue(v)
v在作为左手端的时候,它是引用;
而作为右手端的时候,它是值。
其他赋值操作
分组运算符()
分组运算符里面可以是表达式,也可以是字面量的值
此算法不将GetValue应用于计算Expression(表达式)的结果。这样做的主要原因是,诸如delete和typeof 等操作符可以应用于括号表达式
(0, person.getName)()
分组运算符
逗号运算符
逗号运算符
MDN:逗号操作符对它的每个操作数水宜(从左到返回最后一个操作数的值。
产生了赋值操作,等同(const getName = person.getName)()
this:全局对象, window
答案:undefined
typeof 未申明变量为什么不报错(非严格模式)
未发生求值? 不是的,
答案:引用不可达,直接返回undefined
var varNum = 10; function evalCode(){ eval(var varNum = 20
) } function evalCode2(){ (0,eval)(var varNum = 30
) } console.log("varNum:", varNum); evalCode() console.log("varNum:", varNum); evalCode2(); console.log("varNum:", varNum); // varNum: 10 // varNum: 10 // varNum: 10