您的位置:首页 > 编程语言 > PHP开发

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

2016-04-04 11:39 585 查看
其实很早就阅读过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 Window

var 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: