<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
/*作用域 解释:变量的作用域在自己所在的这个函数*/
/*
var a=1;
function t1(){
var b=2;
function t2(){
var c=3;
alert(a+b+c);
}
t2();
}
t1();*/
// ==6 函数嵌套很普遍 首先变量函数里寻找 找不到再到外层 直到最外层
/*
Q var 函数里什么时候要加
A var是在函数运行的上下文中声明一个变量
没加var 仅仅是赋值操作 但不要狭隘的理解为全局
*/
/*alert(window.d);//undefied
alert(window.e);//und
function t(){
d=5;
//赋值操作 函数内找不到var(声明操作) 直到最外层, 写了个全局 window.d=5;
var e=6;//var 函数内的变量,在全局内声明就是全局,这里是函数里声明
}
t();
alert(window.d);//5
alert(window.e);//und
*/
/*
Q 一个加window.d 一个不加win,什么区别
A 用一个没有的变量测试,有win的引用全局变量时,是作为某个属性不存在返回un
不加win 是报 xxxis not und ,上面一个轻微一点 */
/*function t1(){
var d;
function t2(){
d=5;//这边赋值,往外找,在t1找到
e=6;//同上面一个例子 全没找到,就写了个全局
}
t2();
}
t1();
console.log(e);// == 6 因为写下面的下面就报错不执行下去了
console.log(window.d);//und
console.log(d);//因为全局 所以is not defied
*/
/*var加不加对找不到这个变量的影响和加不加win类似*/
var str1='tama';
function t1(){
console.log(str1);//存在的变量 打印变量
console.log(str2);//执行到这行时 在函数t1内找没, 又到外层全局寻找str2
str2 = 'beef';//到这行 才把全局赋上值,如果上下两行颠倒就能显示出来了
var str2= 'bee';
}
t1();
//tama beef is not defied
// tama bee undefied
</script>
</head>
<body>
</body>
</html>
为什么会有undefied和is not defined区别呢
这就要引出这个了----词法分析
js代码自上而下执行
但是在整体运行分:
词法分析期
运行期
自上而下执行之前,先有一个词法分析过程 就是下面说的
js里的函数运行解析
0.函数运行前 生成 Active Object(活动对象,缩写AO)
从函数的三个看:参数(函数名后括号里的),变量声明(有var的),函数声明(function)
1.参数 形成AO的属性,值为undefined,如有==那个值
2.变量 同上 但若已存在,则不改变
3.函数 例:function foo(){} 赋给foo属性,若已存在,则覆盖
function a(b){
alert(b);
function b(){
alert(b);
}
b();
}
a(1);
/*词法分析
ao.b=und 1
alert也算var 因为已存在不改
b() ao.b=func b....
运行期 依次alert,没有其他变化,所以两次alert都是func*/
function a(b){
// alert(b);
var b=1;
function b(){
alert(b);
}
b();
}
a(1);
/*
alert 改为var b=1
词法分析期不变
运行期 赋值操作 把函数用1代替了 运行的话,会说b()不是function type 把alert放在1那行后面就能看到打印为1*/
function a(b){
alert(b);
b=function b(){
alert(b);
}
b();
}
a(1);
/*词法分析
ao.b= 1
alert也算var 因为已存在不改
只有这两行,没有函数
运行期
alert 1
b= ... 赋值 b为函数
*/