1.各种数据在alert中弹出时候的表现形式
(1) var a = 10; ------> 10 number
(2)var a ="100" -------> 100 string
(3)var a = true -------> true boolean
(4)var a = function (){ alert( 1 ) }; -----> 函数快 function
(5)var a = [1,2,3,4,function(){ alert( 1 ) }]; ---> 1,2,3,4,function(){ alert( 1 ) };
各个块中的内容是什么,分别按对应的进行弹出,以逗号隔开。
(6)var a = document; ----> object HTMLDocument object
(7)var a = document.body; ---->object HTMLBodyElement object
(8)var a = document.querySelector(' div '); ------> object HTMLDivElement object
object 指明对象的类型为object HTMLDivElement 指明它是一个什么对象
(9)var a = {
name : "dachui",
age : 18
} -----> object Object
(10) var a = undefined; ---> undefined undefined
(11)var a = null; -----> null object
2.js的解析顺序
js代码是按照作用域的顺序来解读代码
作用域:一个起作用的范围
script标签是最大的作用域,每一个函数在执行的时候,都会产生一个新的作用域,每一个函数都是一个域
每一个域中代码的解析顺序:
(1)定义
找 var 和function
var 只会var出变量名 并不会执行
function (函数定义->函数名) 会定义整个函数体 而不仅仅是名字
(2)执行
从上往下解读代码
3.作用域
(1)全局变量
按照作用域顺序来解读代码
script标签下面的var相对于 window.
eg: var a = 10; ==== window.a = 10;
即便是不写var 直接 a = 10;它也相当于 window.a = 10; 所以的window.都可以省略
script当前域的所有var都相当于定义在window对象下,也就是说如果你在script域下定义一个变量的话,其实是不需要写var的
b = "100"; ====> window.b = "100"; ---> 全局变量
但是在实际项目中,尽量要避免全局变量 以防代码污染
(2)局部变量
function goudan(){
var a = 10; --->局部变量
}
这时候定义出的来 a = 10 在函数的外面是无法访问的 因为函数本身就是一个新的域
4.作用域链
当作用域用到某个变量,但自身没有的时候,会往父作用域去找,知道找到最大的作用域(window位置)停止,如果window也没有就会报错
注意:只可以子作用域往父作用域去找,不可以父作用域往子作用域去找
5.重名问题
(1)俩个变量名重名
同一个作用域下,俩个变量名重名只需要var 一个即可
(2)俩个函数重名
俩个函数重名(函数定义时),后面的覆盖前面的
(3)函数和变量重名
var和函数重名,以函数为准
6.函数的参数问题
定义过程中也包括:函数的参数。
定义过程中,形参不仅仅是定义,还会和实参对应的赋值,形参相当于var了一个局部变量 并且进行了赋值
7.return函数时的作用域
在那里返回,就从原来的地方看作用域
eg:
fn()();
var a = 0;
function fn(){
alert( a );
var a = 3;
function c(){
alert( a )'
}
return c;
} -----> undefined 3
分析:
1.定义
var a; function fn(){}
2.赋值
fn()(); ----> 1.定义
var a;
function c(){};
2.执行
alert( a ); ---> undefined
a = 3;
return c; ---->3
a = 0;
函数和函数并列执行不受任何东西影响,没有任何关系,你执行你的我执行我的
8.if和for作用域的问题
if和for不存在作用域,代码会被定义执行。不论条件真与假 定义过程一定会被定义到,执行过程看条件来执行,预解析
for的执行顺序和if是一样的,都会进行预解析。