会出现fn1 is not defined // 只有火狐特殊在此
<!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
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31089.html