js中定義函數的方法.
function add(a,b){
return a + b;
}
如果沒有return語句,函數執行好後也會返回執行結果,只是結果爲undefined.
js中有一個免費贈送的關鍵字arguments,他只在函數內部起作用,永遠指向傳入的當前參數,arguments類似array但又不是array.
function add(a,b){
for(var i = 0; i < arguments.length;i++)
console.log('arg' + arguments[i]);
}
add(2,3);
js函數允許接收任意多個參數,es5提供了rest參數,可以獲得除了標準傳入的參數外其餘的參數.
function add(a,b, ...rest){
console.log(rest);
}
add(2,3,4,5,6);
如果傳入的參數沒有填滿,也沒有關係,rest參數會接收一個空數組.
小心return語句,js引擎會在每個句子的行末加上;
function foo(){
return
2;
}
console.log(foo());
這種相當於 return undefined;
所以用return {2};
變量域與解構賦值.
var 申明的變量實際是有作用域的.
如果一個變量在函數體內部申明,則該變量的作用域爲整個函數體,在函數體外不可引用該變量:
'use strict';
function foo() {
var x = 1;
x = x + 1;
}
x = x + 2; // ReferenceError! 無法在函數體外引用變量x
由於js函數可以進行嵌套,那麼,內部函數可以訪問外部函數定義的變量.反過來就不行.
function foo(){
var x = 1;
function bar(){
var y = x + 1;
console.log(y);
}
bar();
}
foo();
js函數有一個特點,會先掃描整個函數體的語句,把所有申明的變量提升到函數的頂部.
function foo(){
var x = 'hello' + y;
console.log(x);
var y = 'Bob';
}
x定義不會報錯,但是 console.log(x)中y不會輸出e全局的作用域:
不在任何函數內定義的變量具有全局作用域:實際上,js有一個默認的全局作用域window,全局屬性被默認綁定到了window上.
,因此,頂層函數的定義也被視爲一個全局變量,並綁定到window
對象
全局變量都會綁定到window上,不同的js文件如果定義了相同的全局變量,或者使用了相同的頂層函數,就會造成命名的衝突.
減少衝突的一個方法是把自己的所有變量和函數全部綁定到一個全局變量中。例如:
/ 唯一的全局變量MYAPP:
var MYAPP = {};
// 其他變量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函數:
MYAPP.foo = function () {
return 'foo';
};
從ES6開始,JavaScript引入瞭解構賦值,可以同時對一組變量進行賦值。
var arr = ['hello','nihao','haha'];
var [x,y,z] = arr;
若數組本身還有嵌套,也可以通過嵌套進行解構賦值,注意嵌套層位置要保持一致.
var [x,[y,z]] = ['hello',['java','c']];
使用場景,解構賦值在很多時候可以大大的簡化代碼,例如交換兩個變量x和y
var x = 1,y = 2;
[x,y] = [y,x];
給對象可以綁定方法即函數.
var xiaoming = {
name:'小明',
birth:1990,
age:function() {
return birth;
}
}
指定到對象上的函數稱爲方法,和普通函數也沒什麼區別,但是它在內部定義了一個this關鍵字,始終指向當前的對象,也就是xiaoming這個變量.所以,this.birth可以拿到birth屬性.當拆開寫:
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25, 正常結果
getAge(); // NaN
單獨調用的時候,就返回了NAN,
this指向的變量視情況而定,比如xiaoming.age(),該this指向被調用的對象,也就是xiaoming,如果進行單獨的調用,比如getAge(),此時,函數的this指向全局對象,
也就是window.
var fn = xiaoming.age; // 先拿到xiaoming的age函數
fn(); /
這種情況也是不行的.要保證this指向正確,必須調用obj.xxx()這種.
var xiaoming = {
name:'小明',
birth:1990,
age:function() {
function getBIrth(){
return this.birth;
}
return getBIrth();
}
}
console.log(xiaoming.age());
這種情況下也是報錯的. this只在age方法的函數內指向xiaoming,在函數內部定義的函數,又指向undefined了.
可以使用that先捕獲this,隨後再進行指向即可.
apply函數的用法.
雖然在一個獨立的函數調用中,根據是否使用strict模式,this指向undefined或者window
要指定函數的this指向哪個對象,可以用函數本身的apply方法,接受兩個參數,第一個是需要綁定的this變量,第二個是array,表示函數本身所需的參數.
function getAge(){
var y = new Date().getFullYear();
return y - this.birth;
};
var xiaoming = {
birth:111,
};
console.log(getAge.apply(xiaoming,[]));
與apply相似的便是call函數 apply把參數打包成array傳入,call按參數順序傳入.
function getAge(a){
var y = new Date().getFullYear();
return y - this.birth + a;
};
var xiaoming = {
birth:111,
};
console.log(getAge.call(xiaoming,1));
apply和call的區別.
https://www.cnblogs.com/lengyuehuahun/p/5643625.html
塊級作用域 用{}綁定起來 可以用let綁定,使{}外的不能夠訪問.
- var定義的變量,沒有塊的概念,可以跨塊訪問, 不能跨函數訪問。
- let定義的變量,只能在塊作用域裏訪問,不能跨塊訪問,也不能跨函數訪問。
- const用來定義常量,使用時必須初始化(即必須賦值),只能在塊作用域裏訪問,而且不能修改。詳情
- https://blog.csdn.net/LKM_wonderful/article/details/70255713