函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別##
函數(shù)聲明:function functionName(){}
函數(shù)表達(dá)式:var fn = function(){}
區(qū)別:
1.函數(shù)聲明會(huì)在代碼開始前定義兔甘,函數(shù)表達(dá)式遇到時(shí)才會(huì)執(zhí)行茅郎。
2.函數(shù)聲明必須有函數(shù)名,函數(shù)表達(dá)式則可以省略蜗顽。
什么是變量的聲明前置贫母?什么是函數(shù)的聲明前置##
變量聲明前置就是在一個(gè)作用域塊中狂丝,所有的變量都被放在塊的開始出聲明劳澄。JavaScript引擎將函數(shù)名視同變量名皂林,所以采用function命令聲明函數(shù)時(shí),整個(gè)函數(shù)會(huì)像變量聲明一樣乱凿,被提升到代碼頭部顽素,只要函數(shù)在代碼中進(jìn)行了聲明咽弦,無論它在哪個(gè)位置上進(jìn)行聲明,js引擎都會(huì)將它的聲明放在范圍作用域的頂部胁出。
arguments 是什么##
arguments 是一個(gè)類數(shù)組對(duì)象型型。代表傳給一個(gè)function的參數(shù)列表。在函數(shù)內(nèi)部全蝶,你可以使用arguments對(duì)象獲取到該函數(shù)的的所有傳入?yún)?shù)
函數(shù)的"重載"怎樣實(shí)現(xiàn)##
function printInfo(name,age,sex) {
if(name) {
console.log(name);
}
if(age) {
console.log(age);
}
if(sex) {
console.log(sex);
}
}
//printInfo(27 ,'male') 輸出 27 male
立即執(zhí)行函數(shù)表達(dá)式是什么闹蒜?有什么作用##
當(dāng)JS執(zhí)行到該行代碼時(shí),函數(shù)會(huì)被定義且立即執(zhí)行裸诽,叫做立即執(zhí)行函數(shù)表達(dá)式嫂用。
使用立即執(zhí)行函數(shù)表達(dá)式可以創(chuàng)建一個(gè)獨(dú)立的作用域,形成隔離丈冬,避免污染全局
求n!嘱函,用遞歸來實(shí)現(xiàn)##
function factor(n) {
if (n>0) {
if (n===1) {
return 1;
}
return n * factor(n-1);
} else if (n===0) {
return 0;
} else {
if (n<0) {
return 'ERROR'
}
}
}
以下代碼輸出什么?##
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, '男');
//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 sum=0;
for (var i=0;i<arguments.length;i++) {
sum += (arguments[i]*arguments[i])
}
return sum;
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
如下代碼的輸出?為什么?##
console.log(a);// 變量聲明前置喉童,a未賦值撇寞,undefined
var a = 1;
console.log(b); //b未定義變量,報(bào)錯(cuò)
如下代碼的輸出堂氯?為什么?##
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name); // hello world 因?yàn)楹瘮?shù)聲明中變量和函數(shù)聲明提前不影響調(diào)用蔑担;
}
var sayAge = function(age){
console.log(age); //報(bào)錯(cuò) 函數(shù)表達(dá)式需要放在調(diào)用之前;
};
11咽白、如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼##
var x = 10
bar() //輸出10
function foo() {
console.log(x) //輸出10
}
function bar(){
var x = 30
foo()
}
查找過程
globalContext = {
AO: {
x:undefined -->10,
foo:function,
bar:function
}
scope:null
}
barContext = {
AO: {
x:undefined-->30啤握,
}
scope: globalContext.AO
}
fooContext ={
AO: { }
scope: globalContext.AO
}
12、如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼##
var x = 10;
bar() //輸出30
function bar(){
var x = 30;
function foo(){
console.log(x) //輸出30
}
foo();
}
12查找過程
globalContext= {
AO: {
x: undefined-->10,
bar:function
}
scope:null
}
barContext = {
AO: {
x:undefined-->30,
foo:function
}
scope: globalContext.AO
fooContext = {
AO :{}
scope: barContext.AO
}
13晶框、如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼##
var x = 10;
bar() //輸出30
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
查找過程
globalContext= {
AO: {
x:10,
bar:function
}
scope:unll
}
barContext = {
AO:{
x: undefined-->30,
匿名函數(shù):function
}
scope: globalContext.AO
}
匿名函數(shù)context = {
AO :{}
scope: barcontext.AO
14排抬、如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼##
var a = 1;
function fn(){
console.log(a) //輸出undefined
var a = 5
console.log(a) //輸出5
a++ //6
var a //6
fn3() //輸出1
fn2() //輸出6
console.log(a) //20
function fn2(){
console.log(a)
a = 20
}
}
function fn3(){
console.log(a)
a = 200
}
fn() //undefined 5 1 6 20
console.log(a) //200
查找過程
globalContext= {
AO: {
a: undefined-->1-->200,
fn:function,
fn3:function
}
scope:null
}
fnContext = {
AO:{
a:underfined-->5-->6-->20,
fn2:function
}
scope: globalContext.AO
}
fn3Context = {
AO:{}
scope :globalContext.AO
}
fn2Context = {
AO: {}
scope: fnContext.AO
}