标签:text 显示 var 火狐 for 循环 get 代码 不可 函数
<!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>
标签:text 显示 var 火狐 for 循环 get 代码 不可 函数
原文地址:https://www.cnblogs.com/tongguilin/p/12229754.html