js作用域

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>无标题文档</title> <script> /*// 作用域:// 域:空间、范围、区域……// 作用:读、写

script

全局变量、全局函数

自上而下 。一个script就是一块,上下两块不同,单线程。上面存着的可以被下面访问的到。

函数

由里到外。不能从外到内,子级作用域找不到就去父级作用域,作用域链。

遇见函数调用,也会发生 预解析,逐行解读代码,相当于有一个小的仓库。

{}

浏览器:

“JS解析器”的步骤

1)首先“找一些东西” :var

function 参数

a = ...

所有的变量,在正式运行代码之前,都提前赋了一个值:未定义

fn1 = function fn1(){ alert(2); }

所有的函数,在正式运行代码之前,都是整个函数块

JS 的预解析

遇到重名的:只留一个 无论上下

变量和函数重名了,就只留下函数,函数是一等公民,预解析两个函数重名的时候,下面

的代替上面的

2)接着逐行解读代码:

表达式:= + - * / % ++ -- ! 参数(参数传参也可以修改值)……

表达式可以修改预解析的值!

alert(a);

// function a (){ alert(4); }var a = 1;alert(a);

// 1function a (){ alert(2); }alert(a);

// 1var a = 3;

alert(a);

// 3function a (){ alert(4); }alert(a);

// 3 alert( typeof a );// a();

3()肯定是错误的

// 报错*/ /*var a = 1;function fn1(){ alert(a); // undefined

//函数内部a和外面完全没有关系。先预解析a=……然后逐行解读遇见表达式再修改 var a = 2;}fn1();alert(a);

// 这次的a是全局范围的a所以找到1 1 var a = 1;function fn1(){ alert(a);

// 1 预解析之后执行时找到外面的作用域去 a = 2;

所以里面的表达式有能力去改外面的值修改的是外部的}fn1();alert(a);

// 2全局的a被修改为2了*/ /*var a = 1;function fn1(a){ alert(a);

// undefined 所以执行了就是undefined

//预解析时候找到了参数(参数就是一个局部变量)但是没有传参,就是undefined a = 2;

// 修改的是局部的,因为并没有去找外部作用域}fn1();alert(a);

// 1

var a = 1;function fn1(a){

函数调用,a传参,此时的a已经被全局的a赋值等于1 alert(a);

// 1 a = 2;

修改的是局部的a,和外面全局的没关系 }fn1(a);alert(a);

// 1*/</script> </head> <body></body></html>/*var num = 0; function fn1(){ num++; 能改变num是因为这里找不到,去父级找,进而修改。}function fn2(){ num--;

相关推荐:JavaScript函数,作用域以及闭包

JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义。 a. 函数的两种定义方式: * function functionName() {} * var functionName = function(){} b. 两种函数定义不同之处 1)

} fn2();fn1();fn2();alert(num); // -1*/ /* 想要获取函数内的值:至少两个方法function fn1(){var a = '大鸡腿~'; str = a;}fn1()alert(a)显示不出来的,哪怕是加一个调用.调用之后也只是创建了一个局部变量而已。直接报错,a is not defined*/var str = ''; function fn1(){ var a = '大鸡腿~'; str = a;}fn1();//函数不会自动执行,必须调用// alert( str );巧妙利用全局变量 function fn2(){ var a = '9999999克拉钻石23456789'; fn3(a);//通过在里面调用的外部全局函数的方法从而获取函数内的值。}fn2(); function fn3(b){ alert(b);}//此函数是全局函数可以被内部访问。// alert(a); // ...undefined而不是a is not defined 预解析中的。不一样 //if (true) {var a=1}; alert( fn1 );

// FF 不能对下面的函数进行预解析,会出现fn1 is not defined

// 只有火狐特殊在此,兼容性问题,正常应该是function fn1(){alert(123);}

// 定义全局变量全局函数那就挪出来,至于上下到无所谓。var a = 1;function fn1(){ alert(123);} if( true ){ // var a = 1; // function fn1(){ // alert(123);

// 本义是未来定义全局变量全局函数} }<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>无标题文档</title> <script>window.onload = function (){ var aBtn = document.getElementsByTagName('input');

for( var i=0; i<aBtn.length; i++ ){

aBtn[i].onclick = function (){

// aBtn[i].style.background = 'yellow'; 不仅没效果而且会报错

// alert( i ); 3…… // 函数for循环执行之后里面才可以点击,

// 函数内部没有i(前提是下面函数没有,有的话会弹出undefined,因为下面有var预解析时给的,

//然后逐步执行),去父级找到i++变成的3。找到了3,如果下面省略了3那它弹出的又是3了

//for 循环内部包一个函数,不可直接利用i,学了闭包才行,很多人会把闭包作用域混杂了

for( var i=0; i<aBtn.length; i++ ){

aBtn[i].style.background = 'yellow';

}//所以要再来一个for循环才能找到0 1 2

// QQ: 1056104999

// bbs.miaov.com

}; }};</script></head> <body><input type="button" value="按钮1" /> <input type="button" value="按钮2" /><input type="button" value="按钮3" /></body> </html>

posted @ 2020-01-22 21:51  珍惜缘份  阅读(89)  评论(0编辑  收藏  举报