关于闭包的问题

$func = function( $param ) {

echo $param;

};
$func( 'some string' );
这样做有什么意义呢,和给function命个名有何不同
function test($param){
echo $param;
}
test('some')

阅读 3.4k
6 个回答

闭包简单说你可以把他理解成,在javascript实现公有,私有,和特权变量。再直接点就是 private变量的get,set操作,闭包创建的内部变量,使这些变量不能被外部随意修改,同时又可以通过指定的函数接口来操作更改。
例子:模拟私有变量

function Counter(start) {
    var count = start;
    return {
        increment: function() {
            count++;
        },

        get: function() {
            return count;
        }
    }
}

var foo = Counter(4);
foo.increment();
foo.get(); // 5

这里,Counter 函数返回两个闭包,函数 increment 和函数 get。 这两个函数都维持着 对外部作用域 Counter 的引用,因此总可以访问此作用域内定义的变量 count.

闭包:用完即释放,用于不需要重复使用的情况,不使用则不创建,节省内存开销

这不是闭包吧,闭包首要条件是函数里return函数,你这只是普通的函数而已。前者是匿名函数,后者是普通的函数。
举个例子,下面这段代码可以正常运行

// 普通函数
function a ($param) {
  console.log('a', $param)
}
// 匿名函数
var b = function ($param) {
  console.log('b', $param)
};
a(1);
b(2);

这段会报错,b未定义

a(1);
b(2);
function a ($param) {
  console.log('a', $param)
}
var b = function ($param) {
  console.log('b', $param)
};

因为普通函数会提升变量,而匿名函数只是一个普通的表达式,不会提升,运行到b(2)的时候,b是未声明的。

语句块内声明函数,在ECMAScript 5的严格模式下,这是不合法的。函数声明应该在作用域的顶层。但在语句块内可将函数申明转化为函数表达式赋值给变量。

这两个的区别是var test = function(){...}
我可以把这个test声明成var,let
function test(){.....} 没法声明成 var,let

我想你在问函数式编程,的黑魔法

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题