当前位置:首页 > Web开发 > 正文

会出现fn1 is not defined // 只有火狐特殊在此

2024-03-31 Web开发

<!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