函數(shù)聲明和函數(shù)表達(dá)式有什么區(qū)別
- 函數(shù)聲明會提升到當(dāng)前作用于執(zhí)行之前;而函數(shù)表達(dá)式提升的聲明是變量的聲明饮笛。
- 函數(shù)聲明必須有標(biāo)識符,也就是函數(shù)名论熙;函數(shù)表達(dá)式的函數(shù)名可以省略福青。
- 函數(shù)的聲明不一定要放到調(diào)用的前面;函數(shù)表達(dá)式的聲明必須放到調(diào)用的前面赴肚。
//函數(shù)聲明
function myName(name){
console.log(name)
}
//函數(shù)表達(dá)式
var= myName = function(){
console.log(name)
}
什么是變量的聲明前置素跺?什么是函數(shù)的聲明前置
- 變量的聲明前置:
提升變量的聲明到當(dāng)前作用于執(zhí)行之前二蓝,此時變量的值為undefined誉券; - 函數(shù)的聲明前置:
提升函數(shù)的聲明到當(dāng)前作用于執(zhí)行之前,所以在當(dāng)前作用域的任何地方都可以調(diào)用函數(shù)刊愚;
arguments 是什么
arguments是一種類數(shù)組對象踊跟,可以通過arguments[0,1,2,]來獲取傳入?yún)?shù)。
函數(shù)的"重載"怎樣實(shí)現(xiàn)
- 根據(jù)傳入?yún)?shù)的類型執(zhí)行不同的操作鸥诽。
- 利用參數(shù)中特殊的參數(shù)值進(jìn)行不同的操作商玫。
- 根據(jù)參數(shù)的個數(shù)進(jìn)行重載。
簡言之:函數(shù)的“重載”就是根據(jù)參數(shù)的不同屬性執(zhí)行對應(yīng)的邏輯牡借。
例:
function fn() {
switch (arguments.length) {
case 0:
//執(zhí)行語句塊
break;
case 1:
//執(zhí)行語句塊
break;
case 2:
//執(zhí)行語句塊
break;
default:
break;
}
}
//根據(jù)參數(shù)的個數(shù)進(jìn)行重載
立即執(zhí)行函數(shù)表達(dá)式是什么拳昌?有什么作用
寫法:
(function(){
})()
//用括號形成函數(shù)表達(dá)式
1,function(){
}()
//用逗號形成函數(shù)表達(dá)式
立即執(zhí)行函數(shù)表達(dá)式的作用就是隔離函數(shù),不會出現(xiàn)變量污染的情況钠龙。
求n!炬藤,用遞歸來實(shí)現(xiàn)
function factor(result){
if(result === 1){
return 1
}
return result *factor(result-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, '男');
//輸出
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//
寫一個函數(shù),返回參數(shù)的平方和沈矿?
function sumOfSquares(){
var a =0;
for(var i=0;i<=arguments.length;i++){
a = + Math.pow(arguments[i],2)
}
return a
}
var result = sumOfSquares(2,3,4)
var result2 = sumOfSquares(1,3)
console.log(result) //29
console.log(result2) //10
如下代碼的輸出上真?為什么
console.log(a);
var a = 1;
console.log(b);
//報錯 因?yàn)閎沒有聲明;如果去掉console(b)羹膳;則會輸出undefined睡互,因?yàn)樽兞柯暶魈嵘耍琴x值在輸出之后陵像。
如下代碼的輸出就珠?為什么
sayName('world');
sayAge(10);
function sayName(name){
console.log('hello ', name);
}
var sayAge = function(age){
console.log(age);
};
//hello world
報錯,因?yàn)楹瘮?shù)表達(dá)式必須先聲明再調(diào)用蠢壹。
如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10
bar()
function foo() {
console.log(x)
}
function bar(){
var x = 30
foo()
}
//查找過程偽代碼:
globalContext = {
AO:{
x:10
foo:function
bar:function
}
Scope:null
}
foo.[[Scope]] = globalContext.AO
bar.[[Scope]] = globalContext.AO
barContext = {
AO:{
x:30
foo:function
}
Scope:bar.[[Scope]] = globalContext.AO
}
fooContext = {
AO:{
}
Scope:foo[[Scope]] =globalContext.AO
//
執(zhí)行console.log(x)時 在fooContext里找不到,所以到globalContext.AO里找到x=10,所以輸出10
- 如下代碼輸出什么? 寫出作用域鏈查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
//查找過程偽代碼
globalContext = {
AO:{
x:10
bar:function
}
Scope:null
}
bar.[[Scope]]:globalContext.AO
barContext = {
AO:{
x:30
foo:function
}
Scope:bar.[[Scope]]globalContext.AO
}
foo.[[Scope]]:barContext.AO
fooContext = {
AO:{
}
Scope:foo.[[Scope]]barContext.AO
}
在barContext里找到X=30嗓违;所以輸出30。
- 以下代碼輸出什么? 寫出作用域鏈的查找過程偽代碼
var x = 10;
bar()
function bar(){
var x = 30;
(function (){
console.log(x)
})()
}
//查找過程偽代碼
globalContext = {
AO:{
x:10
bar:function
}
Scope:null
}
bar.[[Scope]] = globalContext.AO
barContext = {
AO:{
x:30
(function()) = (function())()
}
bar.[[Scope]]globalContext.AO
}
bar.[[Scope]] = globalContext.AO
輸出30
- 以下代碼輸出什么图贸? 寫出作用域鏈查找過程偽代碼
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)
//查找過程偽代碼
globalContext = {
AO:{
a:1 200
fn:function
fn3:function
}
Scope:null
}
fn.[[Scope]] = globalContext.AO
fn3.[[Scope]] = globalContext.AO
fnContext = {
AO:{
a:undefined 5 6 20
fn2:function
}
Scope:globalContext.AO
}
fn2:[[Scope]]=function.AO
fn3Context = }
AO:{
}
Scope:globalContext.AO
}
fn2Context = {
AO:{
}
Scope:fnContext.AO
}
輸出為:undefined ,5 , 1, 6 ,20 ,200