符号优先级
当多个运算符出现一个语句中 会有一个执行的顺序
var a=(20+30)*50//优先括号
var a=b+c*d//乘法优先
案例:
对于函数fn中有一个fm函数的情况做以下操作:
1.打印 new fn和new fn() 带参和不带参都打印function fm
2.new fn()() 双括号 返回fm中的数组并创建为新数组
3.new new fn()() 创建一个名为fm的空数组
function fn() {
return function fm() {
return console.log([1, 2, 3, 4])
}
}
var re = new fn
var re = new fn() //带参与不带参都打印function fm
console.log(re);
var re2 = new fn()() //双括号打印fm中返回的数组
console.log(re2);
var re3 = new new fn()() //一个名为fm的空数组
console.log(re3);
面试题:
由以下面试题可以看出:
1.Foo.getName 函数名.getName 不加参数指向声明的函数 Foo.getName=function
2.Foo().getName() 函数名().getName() 带了参数 指向直接函数function getName(){}
Foo() 运行Foo函数结果为return this =window 然后相当于window.getName()
3.new Foo.getName() 由 优先级:()>成员访问(obj.age))>new 带参 >new 无参|函数调用
所以根据优先级: new (Foo.getName) () ==>new 函数() ==> Foo.getName = function (){log(2)}
4.new Foo().getName() (new Foo()) (new Foo()).getName()
5.new new Foo().getName() new ((new fn()).rank)()
function Foo() {
getName = function () {
console.log(1);
}
return this;
}
Foo.getName = function () {//把foo当对象添加成员
console.log(2)
}
Foo.prototype.getName = function () {//在原型中创建方法
console.log(3)
}
var getName = function () {
console.log(4)
}
function getName() {
console.log(5)
}
Foo.getName();//2 点语法这里吧foo当对象看待就打印点语法添加的对象
getName();//4 var 声明的函数会提升函数名上去 没有声明的函数 只会提升function上去
Foo().getName();//1 带了参数这里当函数看待 foo()=>window =>window.getName() 因为this在这里表示window 这里把window.getName改成了1
getName();// 因为上一步window.getName改成了1 所以打印1
new Foo.getName();//new (foo.getName) () //2
new Foo().getName();//(new fool()).getName() | new fool()==>fool()=>this->{__proto__:foo.prototye}==>{getName:func(){log(3)}}
new new Foo().getName();