函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
函數(shù)聲明使用 function fn(){}
直接寫 吼拥,在函數(shù)前后都可以調(diào)用該函數(shù)
fn(); // jirengu
function fn(){
console.log('jirengu');
}
fn(); // jirengu
函數(shù)表達(dá)式使用 var fn = function(){}
聲明,調(diào)用函數(shù)必須先聲明,再調(diào)用
fn(); // 報(bào)錯(cuò) fn is not a function
var fn = function(){
console.log('jscode')
}
fn(); // jscode
什么是變量的聲明前置丑搔?什么是函數(shù)的聲明前置
在同一個(gè)作用域下,聲明前置是把該聲明的變量和函數(shù)提升到自身所在作用域的最頂部蛋辈。
console.log(str);
var str = 'jirengu';
console.log(str);
fn();
function fn(){
console.log('jirengu');
}
js解析順序
var str;
function fn(){
}
console.log(str); // undefined
var str = 'jirengu';
console.log(str); // jirengu
fn();
console.log('jirengu');
arguments 是什么
arguments
是一個(gè)類數(shù)組對(duì)象瑟慈,它包含了函數(shù)的所有傳入?yún)?shù),可以用數(shù)組下標(biāo)來(lái)獲取值仔雷,不建議使用蹂析,因?yàn)榭勺x性很差
function fn(name, age, sex){
console.log(name); // 柏龍
console.log(age); // 30
console.log(sex); // 男
console.log(arguments); // 獲取的是 ['柏龍', 30, '男']
console.log(arguments[0]); // 柏龍
}
fn('柏龍', 30, '男');
函數(shù)的"重載"怎樣實(shí)現(xiàn)
在JS中沒有重載,同名函數(shù)會(huì)覆蓋
但可以在函數(shù)體針對(duì)不同的參數(shù)調(diào)用來(lái)執(zhí)行相應(yīng)的邏輯
function fn(name, age, sex){
if(name){
console.log(name);
}
if(age){
console.log(age);
}
if(sex){
console.log(sex);
}
}
fn('柏龍', 30);
fn('柏龍', 30, '男');
立即執(zhí)行函數(shù)表達(dá)式是什么碟婆?有什么作用
(function(){ var str = 'jirengu'; })();
作用 隔離作用域电抚,讓函數(shù)里面的變量被保護(hù)起來(lái),外部無(wú)法訪問
求n!竖共,用遞歸來(lái)實(shí)現(xiàn)
function fn(n){
if(n === 1){
return 1;
}
return n * fn(n-1);
}
fn(6); // 720 => 6 * 5 * 4 * 3 * 2 * 1
以下代碼輸出什么蝙叛?
function getInfo(name, age, sex){
console.log('name:',name);
console.log('age:', age);
console.log('sex:', sex);
console.log(arguments);
arguments[0] = 'valley';
console.log('name', name);
}
getInfo('饑人谷', 2, '男');
getInfo('小谷', 3);
getInfo('男');
getInfo('饑人谷', 2, '男');
'name': 饑人谷
'age': 2
'sex': 男
['饑人谷', 2, '男']
'name' valley
getInfo('小谷', 3);
'name': 小谷
'age': 3
'sex': undefined
['小谷', 3]
'name' valley
getInfo('男');
'name': 男
'age': undefined
'sex': undefined
['男']
'name' valley
寫一個(gè)函數(shù),返回參數(shù)的平方和公给?
function sumOfSquares(){
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result) //10
代碼:
function sumOfSquares(){
var result = 0;
for (var i = 0; i < arguments.length; i++) {
result += arguments[i] * arguments[i]
}
return result;
}
如下代碼的輸出借帘?為什么
console.log(a);
var a = 1;
console.log(b);
依次輸出:
undefined
Uncaught ReferenceError: b is not defined
因?yàn)槁暶鞯淖兞繒?huì)提升到自身所在作用域的最頂部。
console.log(a); // 先聲明淌铐,在第一行輸出是沒有賦值肺然,輸出undefined
console.log(b); // 沒有聲明 所以會(huì)報(bào)錯(cuò)
如下代碼的輸出?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
依次輸出:
undefined
Uncaught TypeError: sayAge is not a function
因?yàn)?function
聲明函數(shù)無(wú)論寫在函數(shù)體前面或后面都可以調(diào)用匣沼,函數(shù)表達(dá)式在調(diào)用時(shí)必須先聲明狰挡,再調(diào)用
如下代碼輸出什么? 寫出作用域鏈查找過(guò)程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
代碼輸出: 10
globalContent = {
AO: {
x: 10,
foo: function,
bar: function
},
scope: null
}
foo.[[scope]] = globalContent.AO;
bar.[[scope]] = globalContent.AO;
barContent = {
AO: {
x: 30
},
scope : globalContent.AO;
}
fooContent = {
AO: {
},
scope : globalContent.AO;
}
如下代碼輸出什么? 寫出作用域鏈查找過(guò)程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
代碼輸出:30
globalContent = {
AO: {
x: 10,
bar: function
},
scope: null
}
bar.[[scope]] = globalContent.AO;
barContent = {
AO: {
x: 30,
foo: function
},
scope : globalContent.AO;
}
foo.[[scope]] = barContent.AO;
fooContent = {
AO: {
},
scope : barContent.AO;
}
以下代碼輸出什么? 寫出作用域鏈的查找過(guò)程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
代碼輸出:30
globalContent = {
AO: {
x: 10,
bar: function
},
scope: null
}
bar.[[scope]] = globalContent.AO;
barContent = {
AO: {
x: 30,
fn : function
},
scope : globalContent.AO;
}
foo.[[scope]] = barContent.AO;
fnContent = {
AO: {
},
scope : barContent.AO;
}
以下代碼輸出什么? 寫出作用域鏈查找過(guò)程偽代碼
var a = 1;
function fn(){
console.log(a)
var a = 5
console.log(a)
a++
var a
fn3()
fn2()
console.log(a)
function fn2(){
console.log(a)
a = 20
}
}
function fn3(){
console.log(a)
a = 200
}
fn()
console.log(a)
代碼輸出:
undefined
5
1
6
20
200
globalContent = {
AO: {
a: 1, // fn3 調(diào)用fnContent.AO a=200
fn: function,
fn3: function
},
scope: null
}
fn.[[scope]] = globalContent.AO;
fn3.[[scope]] = globalContent.AO;
fnContent = {
AO: {
a: undefined, // 第二次打印為 5
fn3: function, // 第三次打印 1
fn2: function, // 第4次打印 6
}
scope: globalContent.AO;
}
fn3Content = {
AO: {
},
scope: globalContent.AO;
}
fn2Content = {
AO: {
a: 20 // 第5次打印 調(diào)用fnContent.AO a=20
}
scope: fnContent.AO;
}