1.立即执行函数
var z = 10;
function foo() {
console.log('z',z); //10
}
(function(funArg) {
var z = 20;
funArg();
//console.log(funArg)
/*
ƒ foo() {
console.log('z',z); //10
}
*/
})(foo);
控制台直接打印10
*************************************************************************************************************************************************
2.带返回值的函数
function fun(n, o) {
console.log('o',o);//undefined 0 0 0
return {
fun: function(m) {
console.log(m,n);//1 0,2 0,3 0
return fun(m, n);
}
}
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
*************************************************************************************************************************************************
3.带返回值的函数--链式调用
function fun(n, o) {
console.log('o1',o);//undefined 0 1 2
return {
fun: function(m) {
console.log(m,n)//1 0,2 1,3 2
return fun(m, n);
}
}
}
var b = fun(0).fun(1).fun(2).fun(3);
这里的链式调用的原理就是在调用函数后返回函数本身
*************************************************************************************************************************************************
4.稍微改变一下,加深理解链式调用和普通调用的区别
function fun(n, o) {
console.log('o2',o); //undefined 0 1 1
return {
fun: function(m) {
console.log(m, n)//1 0,2 1,3 1
return fun(m, n);
}
}
}
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
*************************************************************************************************************************************************
5.立即执行函数传参
var test = (function(a) {
this.a = a;
return function(b) {
console.log(a,b)// 1 4
return this.a + b;//1+4=5
}
})(function(a, b) {
console.log(a,b)// 1 2
return a;
}(1, 2));
console.log(test(4));
*************************************************************************************************************************************************
6.隐式转换
var a;
var b = a / 0;
console.log(b,b === b)//NaN false
if(b === b) {
console.log(!b * 2 + "2" - 0 + 4);
} else {
console.log(!b * 2 + "2" - 0 + 4);//1*2+'2'=22-0=>22+4=26
} //26
var a = 1;
var b = a / 0;
console.log(b,b === b)//Infinity true
if(b === b) {
console.log(!b * 2 + "2" - 0 + 4);//0*2+'2'=02-0(转换为数字)=>2+4=6
} else {
console.log(!b * 2 + "2" - 0 + 4);
} //6
*************************************************************************************************************************************************
7.声明提前
console.log('a',a);
/*
ƒ a() {
console.log('1a',a); //ƒ a(){console.log(a);}
}
*/
a();
/*
ƒ a() {
console.log('1a',a); //ƒ a(){console.log(a);}
}
*/
var a = 3;
function a() {
console.log('1a',a);
}
*************************************************************************************************************************************************
8.数组切片--不涉及函数调用
var arr1 = "john".split('');
var arr2 = arr1.reverse();
var arr3 = "jones".split('');
arr2.push(arr3);
console.log(arr1)
/*
* (5) ["n", "h", "o", "j", Array(5)]
0: "n"
1: "h"
2: "o"
3: "j"
4: (5) ["j", "o", "n", "e", "s"]
*/
console.log(arr1.length + '' + arr1.slice(-1));
//5 j,o,n,e,s
*************************************************************************************************************************************************
9.++在数字变量前和数字后的区别
//++在数字变量之前
var t = 10;
function test(t) {
var t = ++t;
console.log(t); //11
}
test(t);
console.log(t); //10
//++在数字变量之后
var t = 10;
function test(t) {
var t = t++;
console.log(t); //10
}
test(t);
console.log(t); //10
*************************************************************************************************************************************************
10.构造函数
function foo() {
//可以看成把foo.a重新赋值
foo.a = function() {
console.log(1);
}
this.a = function() {
console.log(2);
}
a = function() {
console.log(3);
}
var a = function() {
console.log(4);
}
};
foo.prototype.a = function() {
console.log(5);
}
foo.a = function() {
console.log(6);
}
foo.a(); //6
var obj = new foo();
obj.a(); //2
foo.a(); //1