JavaScript中同名标识符优先级

来源:互联网 发布:php cs fixer v2.phar 编辑:程序博客网 时间:2024/05/01 17:04

一,局部变量先使用后声明,不影响外部同名变量


1
2
3
4
5
6
7
varx = 1;// --> 外部变量x
functionfn(){
    alert(x); // --> undefined 局部变量x先使用
    varx = 2;// 后声明且赋值
}
fn();
alert(x); // --> 1<br>

第一点,函数fn内第一句输出x,x是在第二句才定义的。这在JS中是允许的,这里的允许是指不会出现语法错误程序可以运行。
但在其它语言如C,Java中却是不允许的。变量必须先声明后使用,如


1
2
3
4
5
6
public class Test {
    publicstaticvoid main(String[] args) {
        System.out.println(x);// 先使用
        intx =10;// 后声明
    }
}

Java中编译器会提示错误,程序无法运行。
第二点,函数fn内的局部变量x不会影响到外部的变量x。即fn内alert输出不是1,而是undefined。


二,形参优先级高于函数名


1
2
3
4
functionfn(fn){
    alert(fn);
}
fn('hello');// --> "hello"

可以看到函数名和形参同名都是fn,输出的是字符串"hello",却不是函数fn的函数体(fn.toString())。


三,形参优先级高于arguments


1
2
3
4
functionfn(arguments){
    alert(arguments);
}
fn('hello');// --> "hello"<br>

arguments对象可以直接在函数内使用,是语言本身提供的一个 特殊标识符 。
这里刚好将形参声明成与其同名。输出可以看到是"hello"而非"[object Object]",即形参arguments覆盖了语言本身提供的真正的arguments。


四,形参优先级高于只声明却未赋值的局部变量


1
2
3
4
5
functionfn(a){
    vara;
    alert(a);
}
fn('hello');// --> "hello"

函数fn形参为a,函数内第一句仅声明局部变量a,却并未赋值。从输出结果是"hello"而非undefined可以看出形参a优先级高于仅声明却未赋值的局部变量a。


五,声明且赋值的局部变量优先级高于形参


1
2
3
4
5
functionfn(a){
    vara = 1;
    alert(a);
}
fn('hello');// --> "1"

函数fn形参为a,函数内第一句仅声明局部变量a,赋值为1。从输出结果是"1"而非"hello"可以看出声明且赋值的局部变量a优先级高于形参a。


六,形参赋值给同名局部变量时


1
2
3
4
5
functionfn(a){
    vara = a;
    alert(a);
}
fn('hello');




原创粉丝点击