`
happyqing
  • 浏览: 3193593 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Javascript中同名标识符优先级

    博客分类:
  • js
阅读更多

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

var x = 1; // --> 外部变量x
function fn(){
	alert(x);  // --> undefined 局部变量x先使用
	var x = 2; // 后声明且赋值
}
fn();
alert(x); // --> 1

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

public class Test {
	public static void main(String[] args) {
		System.out.println(x); // 先使用
		int x = 10; // 后声明
	}
}

 

Java中编译器会提示错误,程序无法运行。

第二点,函数fn内的局部变量x不会影响到外部的变量x。即fn内alert输出不是1,而是undefined。

 

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

function fn(fn){
	alert(fn);
}
fn('hello'); // --> "hello"

 

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

 

 

三,形参优先级高于arguments 

function fn(arguments){
	alert(arguments);
}
fn('hello'); // --> "hello"

 

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

 

 

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

function fn(a){
	var a;
	alert(a);
}
fn('hello'); // --> "hello"

 

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

 

 

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

function fn(a){
	var a = 1;
	alert(a);
}
fn('hello'); // --> "1"

 

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

 

 

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

function fn(a){
	var a = a;
	alert(a);
}
fn('hello');

 

暂不运行,猜测下结果。如果按照第五点:声明且赋值的局部变量优先级高于形参。那么a将是undefined。但实际上a是"hello",即右a是形参a,左a才是局部变量a。

 

 

 

这里的两个a互不干扰,谁也没覆盖谁。这与刚刚说的赋值的局部变量优先级高于形参又矛盾了。但引擎这样做的确是我们想要的,因为并不希望var a = a后a是undefined。

 

引用:

http://snandy.iteye.com/blog/812668

 

分享到:
评论

相关推荐

    浅析JavaScript中的同名标识符优先级

    同名标识符优先级指的是在不同作用域中存在相同名称的标识符时,JavaScript引擎如何决定使用哪一个标识符。这涉及到变量作用域、提升(hoisting)、参数传递、函数声明、函数表达式等方面的知识点。 首先,关于局部...

    学习笔记

    6. **Javascript中同名标识符优先级** JavaScript允许在不同作用域内定义同名标识符,但其解析规则遵循作用域链。理解这一点对于避免变量冲突和正确使用闭包至关重要。 7. **java实现高性能的数据同步** 在多线程...

    浅谈js中同名函数和同名变量的执行问题

    如果在闭包中定义了同名的函数和变量,那么这些同名的标识符会根据作用域链上的位置进行访问,而不是简单的覆盖。在闭包中,函数的创建比变量的赋值拥有更高的优先级。也就是说,即使后续定义了同名的变量,内部函数...

    深入解读JavaScript中的Hoisting机制

    JavaScript中的变量和函数声明都有各自的优先级。按优先级顺序排列,它们分别是: - 语言内置的对象,如`this`和`arguments`; - 形式参数,即函数定义时的参数; - 函数声明; - 变量声明。 如果变量声明和函数...

    青软实训web考试题.pdf

    8. JavaScript标识符命名规范:标识符的第一个字符不能是数字,但可以是字母、下划线或美元符号。JavaScript是区分大小写的,且标识符不能与保留字相同。 9. CSS选择器优先级:ID选择器 > 类选择器 > 标签选择器 > ...

    青软实训web考试题.docx

    在JavaScript中,使用模板字符串的方式是 `var name = `漫步时尚广场`;`,即选项 A 是正确的。 ### 六、JavaScript标识符的命名规则 1. **首字符限制**:标识符的第一个字符必须是字母、下划线或美元符号。 2. **...

    浅谈js中的变量名和函数名重名

    在JavaScript编程语言中,变量名和函数名重名是一个常见的问题,这主要涉及到JavaScript的预解析(hoisting)机制和作用域规则。本文将深入探讨这个问题,并解释为什么在某些情况下,代码可能会出现“is not a ...

    2021-2022计算机二级等级考试试题及答案No.919.docx

    2. **标识符的合法性**:合法的标识符在编程语言中用于变量、函数等命名,必须以字母、下划线开头,后续可跟字母、下划线或数字。在给定选项中,Hello_World和username123是合法的,而class和123username不是。 3. ...

    最新JAVA等级考试题库.docx

    - **方法重载**(选项C):Java支持在一个类中定义多个同名方法,只要这些方法的参数列表不同即可,这被称为方法重载。 ### 9. Applet初始化方法 - **Applet的初始化方法**(选项D):在Java Applet程序中,通常...

    web标准培训教案-CSS+DIV

    DOM(Document Object Model)用于操作网页内容,以及ECMAScript(JavaScript的标准化版本)用于实现交互行为。这一系列规范旨在使网页更具可访问性、可维护性和互操作性。 2. **为什么要使用Web标准**: - **协同...

    2021-2022计算机二级等级考试试题及答案No.18479.docx

    - **概念**:在同一个类中可以存在一个以上的同名方法,只要这些方法的参数列表不同(参数个数、参数类型不同)或参数顺序不同即可。 - **正确答案解析**:选项 ACD 正确。选项 B 描述的情况实际上是方法重载的一个...

    2021-2022计算机二级等级考试试题及答案No.14430.docx

    - **知识点概述**:方法重载是在同一个类中定义多个同名的方法,但它们的参数列表不同。 - **详细解释**:方法重载的关键在于方法签名(即方法名和参数列表)的不同,即使返回类型相同,只要参数个数、类型或顺序...

Global site tag (gtag.js) - Google Analytics