DeanPaul / blog

MIT License
2 stars 1 forks source link

SEC Session 4 #36

Closed DeanPaul closed 6 years ago

DeanPaul commented 6 years ago

第七章 函数表达式

 函数表达式的特征  使用函数实现递归  使用闭包定义私有变量

DeanPaul commented 6 years ago

函数声明

函数的name属性 函数声明提升

var a= 4; 
function b() { 
  a =3; 
  console.log(a); 
  function a(){} 
} 
b() 
console.log(a); 
var add = function(x) { 
    var sum = x; 
    var tmp = function(x) { 
        sum = sum + x; 
        return tmp; 
    }
    tmp.toString = function(){
        return sum;
    }
    return tmp; 
}
 alert(add(1)(2)(3))
DeanPaul commented 6 years ago

函数表达式

var functionName = function(arg0, arg1, arg2){
//函数体
};
//不要这样做!
if(condition){
  function sayHi(){
    alert("Hi!");
  }
} else {
  function sayHi(){
    alert("Yo!");
  }
}
DeanPaul commented 6 years ago

7.1 递归

一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 分解成质因数 var meta = [1,2,[3,4,[5]],6,[7,[8,9,[10,11,[12]]]]]; ========> [1,2,3,4...] deep clone 二叉树查找

DeanPaul commented 6 years ago

7.2 闭包

匿名函数和闭包

闭包是指有权访问另一个函数作用域中的变量的函数

DeanPaul commented 6 years ago

7.2.1 闭包与变量

function createFunctions(){
  var result = new Array();
  for (var i=0; i < 10; i++){
    result[i] = function(){
    return i;
  };
 }
return result;
}
(function() { 
    var m = 0; 
    function getM() { 
        return m; 
    } 
    function setM(a) { 
        m = a; 
    }
    window.g = getM; 
    window.f = setM; 
})(); 
f(100); 
console.info(g());
var a = 10;  
function foo () {  
console.log(a);  
}  
function aaa(fn) {  
 var a = 100;  
 fn();  
}  
aaa(foo);  
<ul>  
  <li>001</li>  
  <li>002</li>  
  <li>003</li>  
</ul> 
var aLi = document.getElementsByTagName('li');  
for (var i = 0; i<aLi.length; i++) {  
  aLi[i].onclick = function() {  
   alert(i);  
  }  
}  
function repeat (func, times, wait) {  
} //这个函数能返回一个新函数,比如这样用  

var repeatedFun = repeat(alert, 10, 5000)  
//调用这个 repeatedFun ("hellworld")  

//会alert十次 helloworld, 每次间隔5秒  
DeanPaul commented 6 years ago

7.2.3 内存泄漏

function assignHandler(){
  var element = document.getElementById("someElement");
  element.onclick = function(){
    alert(element.id);
  };
}

抓Dom 互抓

DeanPaul commented 6 years ago

7.3 模仿块级作用域

function outputNumbers(count){
for (var i=0; i < count; i++){
console.log(i);
}
var i; //重新声明变量
console.log(i); //计数
}
(function(){  //匿名函数
//这里是块级作用域
})();
function(){
//这里是块级作用域
}(); //出错!
DeanPaul commented 6 years ago

7.4 私有变量

function MyObject(){
//私有变量和私有函数
  var privateVariable = 10;
  function privateFunction(){
    return false;
  }
//特权方法
  this.publicMethod = function (){
    privateVariable++;
    return privateFunction();
  };
}
DeanPaul commented 6 years ago
var o={
  fn:function (){
    console.log(fn);
  }
};
o.fn();
var fn=function (){
  console.log(fn);
};
fn();
DeanPaul commented 6 years ago
function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?
//问:三行a,b,c的输出分别是什么?