js和php中的作用域链的理解

来源:互联网 发布:java log4j maven 编辑:程序博客网 时间:2024/05/17 04:12

其实很早就阅读过javascript权威指南,只是当时还是实习,读的似懂非懂的,现在在这里温故知新作用域链的知识

object(Demo)#1 (2) {  ["name"]=>  NULL  ["age"]=>  int(0)}#看到这一段php中用var_dump打印出来的对象结构了吗,对的,其实这就是一个树形结构,js中的作用域也是这种链子的结构;所以每次函数调用的时候函数内部变量的作用域链都是不一样的
    function counter() {        var n = 0;        return {            count: function() {                return n++;            },            reset: function() {                n = 0;            }        }    }    var c = counter(), d = counter();    console.log(c.count());//0    console.log(d.count());//0    //console.log(c.reset());    console.log(c.count());//1    console.log(d.count());//1    console.log(c.count());//2    console.log(d.count());//2    #对象的属性在函数执行完之后并没有释放,所以在下一次调用的时候还累加了,相当于实现了私有的静态变量。这样来实现,其实也是js的苦啊。回头想想jquery整个就是一个闭包的设计
再来看看阮一峰举得几个例子var name = "The Window";  var object = {    name : "My Object",    getNameFunc : function(){      return function(){        return this.name;      };    }  };alert(object.getNameFunc()()); //The Windowvar name = "The Window";  var object = {    name : "My Object",    getNameFunc : function(){      var that = this;      return function(){        return that.name;      };    }  };alert(object.getNameFunc()());//My Object #需要注意的是this永远指向实例的应用,所以要看看确定this获取到的那个值得时候,应该看看实例是在什么作用域中执行的
 #下面是一段php代码,在php中可以使用闭包来实现匿名函数啦 class Cart {    const PRICE_BUTTER = 1.00;    const PRICE_MILK = 3.00;    const PRICE_EGGS = 6.95;    protected $products = array();    public function add($product, $quantity) {        $this->products[$product] = $quantity;    }    public function getQuantity($product) {        return isset($this->products[$product]) ? $this->products[$product] : FALSE;    }    public function getTotal($tax) {        $total = 0.00;        $callback = function($quantity, $product) use ($tax, &total) {            $pricePeritem = constant(__CLASS__ . "::PRICE_" . strtoupper($product));            $total += ($pricePeritem * $quantity) * ($tax + 1.0);        }        array_walk($this->products, $callback);        return round($total, 2);    }}
0 0
原创粉丝点击