1.萬物皆為對象 提起函數首先要知道對象,而對象又是js數據類型中的一種,所以我們從頭開始。 1)javascript數據類型有哪些? 原始數據類型:number,undefined,null,string,boolean 引用數據類型:object 2)數據類型的檢測: typeof(需要檢測的內 ...
1.萬物皆為對象
提起函數首先要知道對象,而對象又是js數據類型中的一種,所以我們從頭開始。
1)javascript數據類型有哪些?
原始數據類型:number,undefined,null,string,boolean
引用數據類型:object
2)數據類型的檢測:
typeof(需要檢測的內容) -- number,string,boolean,function,object,undefined (返回的結果都是string類型)。
typeof(null) 返回的結果為object
3)引用數據類型:
對象都有自己的屬性和方法:
function fun(a,b,c){ //函數類對象
}
console.log(fun) //fun它也是window對象底下的屬性
//fun自己的屬性
console.log(fun.name) //輸出函數的函數名
console.log(fun.length) //形參的個數
console.log(fun.prototype) //原型
//函數也是可以直接當成對象使用的
//對象的增刪查改
fun.abc = 123; //增
fun.bcd = function(){ //增一個特殊的元素
console.log("hello")
}
fun.bcd();
fun.abc; //查
fun.abc = 456; //改
console.log(fun.abc);
delete fun.abc; //刪
4)原始數據類型:
可以改變的引用類型,和不可以改變的原始類型(這個地方的改變和不改變表示的是存儲結構);
//一定是會改變存儲的地址
var str = "hello world";
str = 123;
console.log(str);
//對象裡面去增加屬性和方法是不會改變存儲的地址的
var obj = {
}
obj.abc = 123;
原始類型屬性的添加;
var str = "hello world";
str.abc = 123; //自己添加屬性
console.log(str.length) //自己自帶的屬性
console.log(str.abc) //原始類型不能添加屬性,如果添加,不會報錯,添加完成系統檢測為原始類型後馬上刪除
當用new的方式創建一個字元串時:(此時為一個對象,數據類型自然變成了引用數據類型)
var str2 = new String("hello world"); //一定出來的是對象
console.log(str2.length)
str2.abc = 456;
console.log(str2.abc);
number等其他類型也一樣:
var num = 123;
num.abc = 456;
console.log(num.abc)
var numobj = new Number(123);
numobj.abc = 456;
console.log(numobj.abc)
實例:
var str = "hello world";
var len = typeof(str);
if(len.length == 6){
len.abc = "typeof檢測的結果為string類型";
}
console.log(len.abc); //最後輸出的是什麼?
輸出的是undefined,len.length=6可以走進迴圈,只是len是原始數據類型,可以添加,但是添加完成馬上就刪除了。
2.函數作用域
在JavaScript中,ES6以前有三種情況:
1.全局作用域
var num = 100;
function fun(){
console.log(num)
var num1 = 200;
function fun2(){
console.log(num1);
}
}
fun()
使用var聲明的變數不是全局就是局部,不是用var聲明的變數都是全局變數
2.函數作用域 (局部作用域)
function fun(){
num = 100;
}
fun();
console.log(num);
函數如果不調用,永遠不會執行,管你裡面的代碼是什麼東西,再多的錯誤不執行也是不會拋出的
3.es6中有塊級作用域
過去,javascript缺乏塊級作用域,var聲明時的聲明提升、屬性變數等行為讓人困惑。ES6的新語法可以幫助我們更好地控製作用域。(這一部分待後續完善)
3.函數聲明和函數表達式
函數聲明
function fun(){
//函數聲明
}
函數表達式
var abc = function fun(a,b,c,d){ //函數表達式
console.log("hello")
}
// 調用abc?fun?
abc();
fun(); //會報錯
console.log(abc.name) //除了這個地方可以看到fun以外,其他沒有任何用處
console.log(fun.name)//會報錯
console.log(abc.length)
console.log(fun.length)
abc這個時候就是一個函數,當abc變成了表達式以後,函數就會放棄自己的名字,所以要調用abc()。
函數表達式和函數聲明的區別:
function fun(){ //函數聲明
console.log("hello");
}()
函數表達式是直接可以被執行符號執行的,在函數的前面可以加上+-!可以讓函數聲明變成函數表達式
+function fun(){ //函數聲明變成函數表達式
console.log("hello");
}()
-function fun(){
console.log("hello");
}()
!function fun(){
console.log("hello");
}()
4.立即執行函數
1.特點:
1.函數聲明瞭以後直接自己執行,用函數的返回值,適合做初始化的工作
2.避免寫全局變數,所有的內容全部都放在立即執行函數中
2.格式:
//1.
(function(){})()
//2.
(function(){
}())
3.功能:
1)初始化
//1加到100的值 var he = (function(n){ var num = 0; for(var i = 1;i<=n;i++){ num+=i; } return num; })(100);
2)功能型
寫功能型的時候,在立即執行函數前面加上分號
;(function(){ console.log(456)})()