参数传递--函数声明与变量声明优先级?

javascript是一门解释性语言,自然没有编译过程,但在脚本执行之前会有语法检查和执行环境的构建,我们把这一过程姑且称为预处理吧。

一、函数声明,javaScript解析器把函数提升

fn();  //output  2

var fn= function(){

console.log(1);

}

function fn(){

console.log(2);

}

fn();  //output  1

首先,后面的fn()函数声明提前,所以第一个fn() 为2

其次,后面定义的fn()覆盖前面声明的函数,所以后面执行的函数为字面两定义的函数,结果为1

函数定义、函数声明、arguments三者优先级?

function   fn(t){

t();                                         @1 var t

function t(){                        @2.var t=function(){console.log(1)}

console.log(2);                  @3.var t=function(){consol.log(2)};

}                                                        @4.t();

var t = function(){

console.log(3);

}

console.log(t);

}

fn(function(){console.log(1)});  //output  2

//output    function(){console.log(3);}

@1.变量声明var t提升到最顶端

@2.arguments中变量首先会覆盖var方式声明的变量(变量声明提升)

@3.函数声明覆盖相同名字的变量

优先级:函数形参>函数声明>变量声明(当变量声明遇到已经有同名的时候,不会影响已经存在的属性)

函数形参---->由名称和对应值组成的一个变量对象被创建,如果没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也被创建

函数声明---->由名称和对应值(函数对象)组成的一个变量对象的属性被创建,如果变量对象已经存在相同的名称属性,则完全替换这个属性

变量声明---->由名称和对应值(undefined)组成一个变量对象的属性被创建,如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的对象

function aa(a,b,c){  @1.a=1  b=2  c=3  @2.a=function a(){}  @3.var a; var aa变量声明提升

function a(){}

console.log(a);

console.log(aa);

console.log(arguments);

var a=‘ee‘;

var aa=‘444‘;

arguments=6;

console.log(a);

console.log(aa);

console.log(arguments);

}

aa(1,2,3);

输出结果:

function a(){}

undefined

[function, 2, 3]

ee

444

6

时间: 2024-08-27 11:14:54

参数传递--函数声明与变量声明优先级?的相关文章

javascript中函数声明、变量声明以及变量赋值之间的关系与影响

函数声明.变量声明以及变量赋值之间有以下几点共识: 1.所有的全局变量都是window的属性 2.函数声明被提升到范围作用域的顶端 3.变量声明被提升到范围作用域的顶端 4.变量声明比函数声明的优先级高,变量声明优先于函数声明被提升,如果两者同名同时存在,后被提升的函数声明会覆盖先被提升的变量声明 5.变量赋值不会被提升,到执行行代码才开始赋值 补充: 6.调用javascript函数的整个过程可以分为预编译期(也叫声明期)和赋值期(也叫计算执行期). 预编译期完成对所有变量(包括形参.函数内部

函数声明与变量声明

1.函数声明与变量声明都会进行变量的声明与提升 2.function name(){}这种格式为函数声明 var x = function name(){}这是函数表达式,相当于变量赋值,也就是说此处的函数不会进行变量的声明与提升 3.函数声明会覆盖变量声明,但不会覆盖变量赋值 function name(){} var name; alert(typeof name)//结果为function 但如果是 function name(){} var name=1; alert(typeof na

JavaScript 函数声明和变量声明

声明语句:声明语句是用来声明或定义标识符(变量和函数名)并给其赋值. 1:var 变量声明(5.3.1节): var语句用来声明一个或多个变量:var name_1 = [= value_1] [ ,..., name_n [= value_n]] var i; var j = 0; var x=1, y=2; var pi = 3.14, f = function(x) {return x*x}, k = f(x); 2:遗漏声明(3.9节) 读取一个没有声明的变量的值:JavaScript会

变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化

一.变量声明和变量赋值: if (!("a" in window)) { var a = 1; } alert(a);//a为? 你可能认为alert出来的结果是1,然后实际结果是"undefined".要了解为什么,我们需要知道JavaScript里的3个概念: 1.所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1; 可以用如下方式来检测全局变量是否声明: "变量名称" in window 2.声明

[js]变量声明、函数声明、函数定义式、形参之间的执行顺序

一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('ledi2'); }; ledi(); 执行顺序: var ledi: function ledi(){ alert('ledi1'); }; //预编译结束 ============== ledi(); ledi = function (){ alert('ledi2'); }; ledi(); 函数

浅谈JS变量声明和函数声明提升

先来两个问题 很多时候,在直觉上,我们都会认为JS代码在执行时都是自上而下一行一行执行的,但是实际上,有一种情况会导致这个假设是错误的. a = 2; var a; console.log(a); 按照传统眼光,console.log(a)输出的应该是undefined,因为var a在a = 2之后.但是,输出的是2. 再看第二段代码: console.log(a); var a = 2; 有人会想到第一段代码,然后回答undefined.还有人会认为a在使用前未被声明,因此抛出Referen

CSS变量:声明全局变量,让编写更快捷 --root

在编写css公共样式的时候,我们都会声明很多通用的颜色.字号等.现在我们可以通过声明CSS变量来实现了 1.变量的声明 CSS变量声明是字母前加两个横线(--)如: body{ --Colors:#dfdfdf; --fS16px:16px; } 上述代码中,body选择器中声明了Colors和fS16px两个变量.而使用'--'是因为$被Sass占用了,@被Less占用了,所以是为了区分它们. 同时,你也可以用--root{}来存放所有变量,在下边使用的时候直接调用即可.如: --root{

js 变量声明易混淆的几点知识

这是我 JavaScript 学习过程中遇到的一些容易混淆的地方,趁着有时间,做了一个整理. 变量提升 变量与函数名提升优先级 js 作用域内有变量,这个很好理解,但有一些细节需要注意. console.log(foo); // 函数 function foo(){ console.log("函数声明"); } console.log(foo); // 函数 var foo = "变量"; console.log(foo); // 变量 当变量名与函数名同名,且都提

javascript篇-----函数作用域,函数作用域链和声明提前

在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于这类型的编程语言,javascript是没有块级作用域.取而代之的,javascript使用的是块级作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. 在如下的所示的代码中,在不同位置定义了变量 i . j 和 k ,它们都在同一个作用域内——这三个变量在函数体内均是有定义