编辑:对重复问题采取措施,但搜索" '()' Javascript"对我没有任何结果。
接下来......我正在对PHP中的图像进行一些像素处理,并将一些Javascript逻辑移植到PHP中,以实现我在html5画布上看到的效果。 Javascript使用一些曲线计算来实现"复古效果"。在循环中调用像素计算:
使用Javascript:
for (var i = (width * height); i >= 0; --i) {
idx = i << 2;
// curves
if (!!_effect.curves) {
_imageData[idx ] = _effect.curves.r[ _imageData[idx ] ]; // r
_imageData[idx + 1] = _effect.curves.g[ _imageData[idx + 1] ]; // g
_imageData[idx + 2] = _effect.curves.b[ _imageData[idx + 2] ]; // b
}
}
effect.curves
对象如下:
var _effect = {
curves: (function() {
var rgb = function (x) {
return -12 * Math.sin( x * 2 * Math.PI / 255 ) + x;
},
r = function(x) {
return -0.2 * Math.pow(255 * x, 0.5) * Math.sin(Math.PI * (-0.0000195 * Math.pow(x, 2) + 0.0125 * x ) ) + x;
},
g = function(x) {
return -0.001045244139166791 * Math.pow(x,2) + 1.2665372554875318 * x;
},
b = function(x) {
return 0.57254902 * x + 53;
},
c = {r:[],g:[],b:[]};
for(var i=0;i<=255;++i) {
c.r[i] = r( rgb(i) );
c.g[i] = g( rgb(i) );
c.b[i] = b( rgb(i) );
}
return c;
})(), // <-- THIS PART
};
我的问题是:上面注意到的行中的()
是否告诉curves
函数在_imageData
循环内调用时运行?
答案 0 :(得分:3)
不,函数调用是作为该对象初始化的一部分发生的(&#34; _effect&#34;)。物业的价值&#34;曲线&#34;将是调用该函数的返回值。该函数构建一个对象并返回它。
在JavaScript中,对带有括号参数列表的函数的引用是总是函数调用。
为了更清楚,想象一下该函数已被声明为普通函数:
function makeCurves() {
var rgb = function (x) {
return -12 * Math.sin( x * 2 * Math.PI / 255 ) + x;
},
r = function(x) {
return -0.2 * Math.pow(255 * x, 0.5) * Math.sin(Math.PI * (-0.0000195 * Math.pow(x, 2) + 0.0125 * x ) ) + x;
},
g = function(x) {
return -0.001045244139166791 * Math.pow(x,2) + 1.2665372554875318 * x;
},
b = function(x) {
return 0.57254902 * x + 53;
},
c = {r:[],g:[],b:[]};
for(var i=0;i<=255;++i) {
c.r[i] = r( rgb(i) );
c.g[i] = g( rgb(i) );
c.b[i] = b( rgb(i) );
}
return c;
}
然后初始化看起来像:
var _effect = {
curves: makeCurves()
};
答案 1 :(得分:3)
这意味着函数在创建并被赋值给curve变量后立即被调用。