JS逗號運算符,apply和call調(diào)用模式,匿名函數(shù),arguments,字面量創(chuàng)建【詩書畫唱】
可能的面試部分:apply和call調(diào)用模式的區(qū)別是什么?我個人給出的答案:
apply后面要傳的參數(shù)要以數(shù)組的形式框起來,而call后面要傳的參數(shù)只要用逗號隔開就可以了,他們的效果是差不多的,就是后面?zhèn)鞯膮?shù)的寫法不同,一般我可能選擇call,因為更簡化。
test.apply(param,[1,2,3]);
?test.call(param,1,2,3);


個人想法:有時先確定節(jié)奏后考試,寫代碼,做項目,創(chuàng)作游戲,創(chuàng)作音樂,創(chuàng)作視頻,創(chuàng)作動漫,創(chuàng)作專欄等等的話就是更加的高效,有時追求簡化而不缺失等等,是很好的方法。

概括:
個人對逗號運算符的理解和記憶規(guī)則等的方法

0、解釋以下的語法現(xiàn)象:
var arr1 = [[true,2,'one'][3],[1,{"num":47}][1]['num']];
var i = 3;
var arr2 = [(i -= 2,[true,'abc'][i]['length']),[[],[][0]][1]];
1、定義一個函數(shù),他有兩個參數(shù),一個是執(zhí)行次數(shù),一個是需要執(zhí)行的函數(shù),調(diào)用這個函數(shù)。
2、定義一個函數(shù),它的返回值是另外一個函數(shù),另外這個函數(shù)有一個打印語句,請調(diào)用函數(shù)運行這個打印語句。
3、同時定義和運行一個匿名的函數(shù),計算1到100之間的整數(shù)和
4、創(chuàng)建一個貓Cat對象,包含一個體重weight屬性和吃飯eat的方法,每調(diào)用一次eat方法,體重就加1,調(diào)用3次eat方法后,在控制臺打印出貓的體重。
5、創(chuàng)建一個Car對象,包含一個花費屬性cost和run方法,run方法中包含一個參數(shù)公里數(shù)kl,每跑1公里,花費就增加0.8元,調(diào)用run方法后,打印出花費。
6、創(chuàng)建一個Dog對象,包含一個搖尾巴shake的方法,該方法有一個參數(shù)name,當name等于'Tom'時,在控制臺打印‘主人回來了’,其他的值不執(zhí)行任何代碼。
7、創(chuàng)建一個函數(shù),包含一個參數(shù)a,當a是函數(shù)時,執(zhí)行a,否則打印出a的值。
8、在頁面創(chuàng)建三個按鈕,通過js腳本循環(huán)給這三個按鈕綁定一個點擊事件,當點擊第一個按鈕彈出數(shù)字0,第二個按鈕彈出數(shù)字1,第三個按鈕彈出數(shù)字2。。。

字面量創(chuàng)建
我試過,這里如果不使用“聲明函數(shù),
? ? ? ? ? ? ? ??for循環(huán)中調(diào)用傳參的函數(shù)”的方法,
? ? ? ? ? ? ? ??那么在for循環(huán)中直接綁定傳要彈出的值i,
? ? ? ? ? ? ? ??會擊按鈕就都是彈出3,是不對的
fn6()();
參數(shù)是函數(shù)的函數(shù)
返回值是函數(shù)的函數(shù)

逗號運算符最后返回的是()里面用逗號運算符隔開的式子的最后一個式子的結果。
定義聲明函數(shù)
在函數(shù)中自己調(diào)用自己
函數(shù)的內(nèi)置對象
arguments
調(diào)用匿名函數(shù)

函數(shù)的四種調(diào)用模式
方法調(diào)用模式:調(diào)用對象中的一個方法
函數(shù)調(diào)用模式
構造器調(diào)用模式
apply和call調(diào)用模式
如果是構造器調(diào)用模式調(diào)用的函數(shù)首字母必須是大寫
構造函數(shù)Function
自己寫的代碼筆記注釋的部分CTRL+F等等(前面的“概括”等等也可以CTRL+F......):
聲明函數(shù)
調(diào)用函數(shù)
調(diào)用函數(shù)返回函數(shù)
傳alter彈出框功能到函數(shù)中?
代入法理解調(diào)用函數(shù)中的函數(shù)(參數(shù)是函數(shù)的函數(shù))
常用的不命名的匿名函數(shù)的調(diào)用
函數(shù)的4種調(diào)用模式

個人對逗號運算符的理解和記憶規(guī)則等的方法?START
逗號運算符最后返回的是()里面用逗號運算符隔開的式子的最后一個式子的結果。


個人對逗號運算符的理解和記憶規(guī)則等的方法?END

作業(yè)的題目和自己寫出的自己理解的答案 START
0、解釋以下的語法現(xiàn)象:
var arr1 = [[true,2,'one'][3],[1,{"num":47}][1]['num']];
var i = 3;
var arr2 = [(i -= 2,[true,'abc'][i]['length']),[[],[][0]][1]];

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
//現(xiàn)象1
var arr1 = [[true,2,'one'][3],[1,{"num":47}][1]['num']];
for(var i=0;i<arr1.length;i++){
console.log("arr1的對象:"+arr1[i])
}
//打印結果:arr1的對象:undefined? ? ?arr1的對象:47
//現(xiàn)象2
var i = 3;
var arr2 = [(i -= 2,[true,'abc'][i]['length']),[[],[][0]][1]];
for(var i=0;i<arr2.length;i++){
console.log("arr2的對象:"+arr2[i])}
//打印結果:arr2的對象:3? ? ?arr2的對象:undefined
</script>
<body>
現(xiàn)象1:
按F12看控制臺的打印的結果可以知道arr1是個數(shù)組,
是由[true,2,'one'][3]和[1,{"num":47}][1]['num']這2個對象構成,
[true,2,'one'][3]的意思是獲取[true,2,'one']數(shù)組中的下標為3的對象,因為
true,2,'one']數(shù)組中不存在下標為3的對象,所以就是打印出undefined,
[1,{"num":47}][1]['num']]的意思是先從[1,{"num":47}]數(shù)組中
獲取下標為1的對象,即為{"num":47},之后從下標為1的對象中獲取名為
num屬性的對應的值,就是47.
現(xiàn)象2: 按F12看控制臺的打印的結果可以知道arr2是個數(shù)組,
是由(i -= 2,[true,'abc'][i]['length'])和[[],[][0]][1]這2個對象構成,
因為開始var i = 3;,
(i -= 2,[true,'abc'][i]['length'])中是逗號運算符,
()里面用逗號運算符隔開的對象都會執(zhí)行,如果都進行賦值,就都會變
,i-=2的結果是1,那么[true,'abc'][1]['length']的結果是3,
逗號運算符最后返回的是()里面用逗號運算符隔開的式子的最后一個式子的結果。
[[],[][0]][1]就是取出[[],[][0]]數(shù)組中下標為1的對象[][0],而[][0]
是取出[]中下標為0的對象,因為不存在,所以打印出來時會是undefined
</body>
</html>


1、定義一個函數(shù),他有兩個參數(shù),一個是執(zhí)行次數(shù),一個是需要執(zhí)行的函數(shù),調(diào)用這個函數(shù)。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
function f(a,b){
for(i=1;i<=a;i++){
b();}
}
f(3,function(){document.write("? 執(zhí)行a這個函數(shù)了")})
</script>
<body>
</body>
</html>

2、定義一個函數(shù),它的返回值是另外一個函數(shù),另外這個函數(shù)有一個打印語句,請調(diào)用函數(shù)運行這個打印語句。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
function f5(){
return function()
{console.log("三連!看到這句話說明成功用f5()()"
+"調(diào)用了函數(shù)中return的函數(shù)中的控制臺打印語句")}
}
f5()();
</script>
<body>
</body>
</html>

3、同時定義和運行一個匿名的函數(shù),計算1到100之間的整數(shù)和

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
(function(a){
var h=0;
for (var i=1;i<=100;i++) {
h=h+i;
}
a.write(h)
})(document)
</script>
<body>
</body>
</html>


4、創(chuàng)建一個貓Cat對象,包含一個體重weight屬性和吃飯eat的方法,每調(diào)用一次eat方法,體重就加1,調(diào)用3次eat方法后,在控制臺打印出貓的體重。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
var Cat={
weight:100,
eat:function(){
this.weight=this.weight+1;
console.log(this.weight+"g")
}
}
Cat.eat();
Cat.eat();
Cat.eat();
</script>
<body>
</body>
</html>


5、創(chuàng)建一個Car對象,包含一個花費屬性cost和run方法,run方法中包含一個參數(shù)公里數(shù)kl,每跑1公里,花費就增加0.8元,調(diào)用run方法后,打印出花費。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
var Car={
cost:0.8,
run:function(kl){
//消費指的是總消費還是每公里的單價消費?這題沒說得明確。所以我說這題有歧義。
console.log("這題其實有歧義,這題我簡化理解為每跑1公里,"+
"總消費就是加0.8元,所以cost為0.8元/公里。"+"跑了"+kl+"公里,"+
"累計花費為:"+0.8*kl+"元")
}
}
Car.run(1);
</script>
<body>
</body>
</html>


6、創(chuàng)建一個Dog對象,包含一個搖尾巴shake的方法,該方法有一個參數(shù)name,當name等于'Tom'時,在控制臺打印‘主人回來了’,其他的值不執(zhí)行任何代碼。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
var Dog={
shake:function(name){
name=='Tom'?console.log("主人我回來了"):false;
}
}
Dog.shake('Tom');
Dog.shake('Jerry');
</script>
<body>
</body>
</html>


7、創(chuàng)建一個函數(shù),包含一個參數(shù)a,當a是函數(shù)時,執(zhí)行a,否則打印出a的值。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
function fn7(a,msg){
if(typeof a === 'function') {
a(msg);
}else {
console.log(a);
}
}
fn7(function(str){
alert(str);
},'詩書畫唱叫你三連和關注!看到這句話說明,調(diào)用時傳的是傳參數(shù)的函數(shù)!');
fn7("看到這句話說明,調(diào)用時,傳的不是函數(shù)!",'詩書畫唱叫你三連和關注!');
</script>
<body>
</body>
</html>



8、在頁面創(chuàng)建三個按鈕,通過js腳本循環(huán)給這三個按鈕綁定一個點擊事件,當點擊第一個按鈕彈出數(shù)字0,第二個按鈕彈出數(shù)字1,第三個按鈕彈出數(shù)字2。。。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
window.onload=function(){
var arr=document.getElementsByTagName("button");
function f(i){
arr[i].addEventListener('click',function(){
? ? ? ? ? ? ? ? alert(i);/*——>我試過,這里如果不使用“聲明函數(shù),
? ? ? ? ? ? ? ? for循環(huán)中調(diào)用傳參的函數(shù)”的方法,
? ? ? ? ? ? ? ? 那么在for循環(huán)中直接綁定傳要彈出的值i,
? ? ? ? ? ? ? ? 會擊按鈕就都是彈出3,是不對的*/
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? });
}
for(var i=0;i<arr.length;i++){
f(i);
}}
</script>
<body>
<button>按鈕1</button>
<button>按鈕2</button>
<button>按鈕3</button>
</body>
</html>




作業(yè)的題目和自己寫出的自己理解的答案 END


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
//定義聲明函數(shù)
//1函數(shù)聲明
function fn1(){
console.log('Hello world');
}
//2字面量創(chuàng)建
//var o = {};
//var arr = [];?
//將一個沒有名字的函數(shù)賦值給了變量fn2
var fn2 = function(){
}
//3構造函數(shù)Function
var fn3 = new Function('alert("Hello world");');
//調(diào)用一個函數(shù):在需要被調(diào)用的函數(shù)名后面加上一對括號
//fn1();
//fn2();
//fn3();
//函數(shù)的參數(shù)
function fn4(a,b,c){
console.log(a,b,c);
}
//調(diào)用函數(shù)時,如果參數(shù)的個數(shù)和函數(shù)的參數(shù)列表的個數(shù)不一樣,
//那么調(diào)用這個函數(shù)時是不會報錯的,參數(shù)的值會對號入座,不夠的值就用undefined代替
//fn4(1,5);//1,5,undefined
//fn4(1,5,6,7);//1,5,6
//JS函數(shù)的返回值類型是可以變化的
function fn5(b){
if(b) {
return {name:'Tome'};
} else {
return 'Hello';
}
}
//console.log(fn5(true).name);
//返回值是函數(shù)的函數(shù)
function fn6(){
return function(){
alert('Hehe');
}
}
//var f = fn6();
//f();
//fn6()();
//參數(shù)是函數(shù)的函數(shù)
function fn7(a,msg){
if(typeof a === 'function') {
a(msg);
}else {
console.log('a不是一個函數(shù)');
}
}
// fn7(function(str){
// alert(str);
// },'你好');
//調(diào)用匿名函數(shù)
(function(doc){
doc.write('Hello world');
})(document);
//函數(shù)的四種調(diào)用模式:
//1方法調(diào)用模式:調(diào)用對象中的一個方法
var stu = {
score: 60,
study: function(){
//console.log(this == stu);
this.score += 5;
}
};
stu.study();
stu.study();
//console.log(stu.score);
var cat = {
name: '咪咪',
eat: function(){
console.log(this == cat);
console.log(this.name);
}
};
//cat.eat();
//2函數(shù)調(diào)用模式
function add(a,b){
console.log(this == window);
return a + b;
}
add(1,2);
//3構造器調(diào)用模式
//如果是構造器調(diào)用模式調(diào)用的函數(shù)首字母必須是大寫
var Stu = function(n){
this.name = n;
}
var s1 = new Stu('小明');//this == s1
console.log(s1.name);
var s2 = new Stu('小紅');//this == s2
console.log(s2.name);
var Cat = function(a){
this.age = a;
}
var c1 = new Cat(2);//this == c1
console.log(c1.age);
//4apply和call調(diào)用模式
function test(x,y,z){
console.log(this.flag);
console.log(x,y,z);
}
//var flag = 'abc';
//test();
// var param = {
// flag: 'phoniex'
// };
//改變了test函數(shù)中this的指向,this == param
// test.apply(param,[1,2,3]);
// test.call(param,1,2,3);
function perform(str){
console.log(str + this.name);
}
var p = {
name: '張三'
};
perform.call(p,'你好');
//函數(shù)的內(nèi)置對象
function show(){
for(var i = 0;i < arguments.length;i ++) {
console.log(arguments[i]);
}
}
show(1,2,3,'one','mee');
// function (){
// //在函數(shù)中自己調(diào)用自己
// arguments.callee();
// }
</script>
</head>
<body>
</body>
</html>



<!--
CTRL+F:
聲明函數(shù)
調(diào)用函數(shù)
調(diào)用函數(shù)返回函數(shù)
傳alter彈出框功能到函數(shù)中?
代入法理解調(diào)用函數(shù)中的函數(shù)(參數(shù)是函數(shù)的函數(shù))
常用的不命名的匿名函數(shù)的調(diào)用
函數(shù)的4種調(diào)用模式
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
//聲明函數(shù) START
var f1=function(){}
//var f2=new function()
function f3(a,b,c){
console.log(a,b,c);
}
function f4(b){
if(b){
return {name:'詩書畫唱'}
}
else{
return "三連"
}
}
//聲明函數(shù) END
// 調(diào)用函數(shù) START
//f2();
f3("三連","關注","詩書畫唱")
console.log(f4(true).name)
// 調(diào)用函數(shù) END
//調(diào)用函數(shù)返回函數(shù) START
function f5(){
return function(){alert("三連!")}
}
f5()();
//調(diào)用函數(shù)返回函數(shù) END
//傳alter彈出框功能到函數(shù)中 START
function f6(a){
a("三連!")
}
f6(alert);
//傳alter彈出框功能到函數(shù)中 END
//代入法理解調(diào)用函數(shù)中的函數(shù)(參數(shù)是函數(shù)的函數(shù)) START
function f7(a,msg)
{
if(typeof a==="function"){
a(msg)
}
else{
console.log("看到這句話,說明傳過來的a參數(shù)不是function函數(shù)")
}
}
f7(function(str){alert(str);},"給詩書畫唱三連!看到這句話說明msg被賦值了!");
//代入法理解調(diào)用函數(shù)中的函數(shù)(參數(shù)是函數(shù)的函數(shù)) END
//常用的不命名的匿名函數(shù)的調(diào)用 START
(function(a){a.write("詩書畫唱提醒你!看到這句話說明成功調(diào)用了匿名函數(shù)中的方法!");})(document)
//常用的不命名的匿名函數(shù)的調(diào)用 END
//函數(shù)的4種調(diào)用模式 START
//1.方法調(diào)用模式
var a={
score:100,
do:function(){
console.log("三連!看到這句話說明成功調(diào)用了a對象中的do方法!")
console.log(this===a)//————>(這里的this等價于當前a對象)
console.log(this.score+"分")//————>(這里的this表示當前a對象)
}
}
a.do();
//2.函數(shù)調(diào)用模式
function f(a,b){
console.log(this)//——>這里打印出的內(nèi)容是Window,這里的this代表的是Window
return a+b;
}
f("關注"+"詩書畫唱")
//3.構造器調(diào)用模式
var F=function(n){
this.name=n;//——>this是調(diào)用時,new出來的對象,比如下面的f1
}
var f1=new F("點贊!");
var f2=new F("關注!");
console.log(f1.name)
console.log(f2.name)
//函數(shù)的4種調(diào)用模式 END
</script>
<body>
</body>
</html>





