tfrcw函数用法_简单对比分析JavaScript中的apply,call与this的使用

1.apply定义

apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数。

语法:apply([thisObj[,argArray]])

thisObj

可选。要用作 this 对象的对象。

argArray

可选。要传递到函数的一组参数。

2.call定义

call:调用一个对象的方法,用另一个对象替换当前对象。

语法:call([thisObj[, arg1[, arg2[, [, argN]]]]])

thisObj

可选。将作为当前对象使用的对象。

arg1, arg2, , argN

可选。将被传递到该方法的参数列表。

3.二者区别

call 的第二个参数可以是任意类型,而apply的第二个参数必须是数组,也可以是arguments。

定义也是有差别的。

4.实例分析

(1)官方实例: function callMe(arg1, arg2){

var s = "";

s += "this value: " + this;

s += "
";

for (i in callMe.arguments) {

s += "arguments: " + callMe.arguments[i];

s += "
";

}

return s;

}

document.write("Original function:
");

document.write(callMe(1, 2));

document.write("
");

document.write("Function called with apply:
");

document.write(callMe.apply(3, [ 4, 5 ]));

document.write(callMe.call(3, 4, 5 ));

// Output: // Original function: // this value: [object Window] // arguments: 1 // arguments: 2 // Function called with apply: // this value: 3 // arguments: 4 // arguments: 5

第一个用apply的:定义:调用函数,并用指定对象替换函数的 this 值

调用函数callMe,使用指定的对象3替换callMe函数中的this,这时候这里的this就从之前的[object Window]变成了3。

第一个用call的:定义:调用一个对象的方法,用另一个对象替换当前对象。

调用对象callMe的方法,用另一个对象3替换callMe中的对象。

从这些结果分析中可以看出,这两者都是使用指定的对象中的对象或者指定的值改变了对象中的this。

也可以说:是一个函数中的对象(this)"劫持"了另一个要执行函数中的对象(this)。

其实这里引出了一个问题:this到底是啥?为何如此重要的一次次来费劲心思的来改变它的指向?

(2)实例: function zqz(a,b){

return alert(a+b);

}

function zqz_1(a,b){

zqz.apply(zqz_1,[a,b])

}

zqz_1(1,2) //->3

分析:根据定义:调用函数,并用指定对象替换函数的 this 值,

这里调用函数zqz,并用指定的对象zqz_1替换zqz函数的this值。

要注意js中的函数名其实是对象,因为函数名是对Funtion对象的引用! function add(a, b)

{

alert(a + b);

}

function sub(a, b)

{

alert(a - b);

}

add.call(sub, 3, 1); // 4

分析:根据定义:调用一个对象的方法,用另一个对象替换当前对象。

这里就是调用对象add的方法,并用add对象替换当前对象sub;

再来一个例子: function zqz(a,b){

this.name=a;

this.age=b;

alert(this.name+" "+this.age);

}

function zqz_1(a,b){

zqz.apply(this,[a,b]) //我们亦可以这么写 zqz.apply(this,arguments)

}

zqz_1("Nic",12) //Nic 12

分析:根据定义:调用函数,并用指定对象替换函数的 this 值,

这里调用函数zqz,使用指定的对象this替换函数zqz的this。

再来一个例子:

function Obj(){

this.value="对象!";

}

var value="global 变量";

function Fun1(){

alert(this.value);

}

Fun1(); //global 变量

Fun1.call(window); //global 变量

Fun1.call(document.getElementById('myText')); //input text

Fun1.call(new Obj()); //对象!

Fun1(); //global 变量

分析:定义:调用一个对象的方法,用另一个对象替换当前对象。

调用Fun1对象的方法,用window对象替换当前Fun1中的对象。

调用Fun1对象的方法,用input中对象替换当前Fun1中的对象。

调用Fun1对象的方法,用新new出来的obj中的对象替换当前Fun1中的对象。

下面我们来看一个网友提出的问题:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

然后自己动手了写了个案例,写的跟想象的有差别;如下代码 function parent()

{

alert(this.name);

}

function child()

{

var name = '张三';

};

parent.call(child);

他输出的是child 为什么不张三 根据上面那句话parent上下文已经变成了child

而child 里面有name 值 应该输出的是张三啊 求大神解释 function parent()

{

alert(this.name);

}

function child()

{

this.name = '张三';

};

var p1 = new child();

parent.call(p1);

这样可以输出 张三 为什么呢?

到底是怎么回事呢,我们来看

call和apply有个用处,就是可以用变量作为函数名称来调用。比如函数的回调函数。具体用法是:被执行函数.call(a,b,c...),其中a是在被执行函数中this需要指定的对象,可以为null,其他参数作为被执行函数的参数。apply用法类似,只不过第二个参数是数组。

举例说明: function doPost(url,param,callback){

//这里处理post请求

var str = xhr.responseText;

callback.apply(this,[str]);//相当于调用了callback(str);并把callback中的this设定为doPost对象

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
时频分析工具箱提供了计算各种线性时频表示和双线性时频分布的函数, 本帖主要列出时频分析工具箱函数简介,以号召大家就时频分析应用展开相关讨论。 一、信号产生函数: amexpo1s 单边指数幅值调制信号 amexpo2s 双边指数幅值调制信号 amgauss 高斯幅值调制信号 amrect 矩形幅值调制信号 amtriang 三角形幅值调制信号 fmconst 定频调制信号 fmhyp 双曲线频率调制信号 fmlin 线性频率调制信号 fmodany 任意频率调制信号 fmpar 抛物线频率调制信号 fmpower 幂指数频率调制信号 fmsin 正弦频率调制信号 gdpower 能量律群延迟信号 altes 时域Altes信号 anaask 幅值键移信号 anabpsk 二进制相位键移信号 anafsk 频率键移信号 anapulse 单位脉冲信号的解析投影 anaqpsk 四进制相位键移信号 anasing Lipscjitz 奇异性 anaste 单位阶跃信号的解析投影 atoms 基本高斯元的线性组合 dopnoise 复多普勒任意信号 doppler 复多普勒信号 klauder 时域Klauder小波 mexhat 时域墨西哥帽小波 二、噪声产生函数 noiseecg 解析复高斯噪声 noiseecu 解析复单位高斯噪声 tfrgabor Gabor表示 tfrstft 短时傅立叶变换 ifestar2 使用AR(2)模型的瞬时频率估计 instfreq 瞬时频率估计 sqrpdlay 群延迟估计 三、模糊函数 ambifunb 窄带模糊函数 ambifuwb 宽带模糊函数 四、Affine类双核线性时频处理函数 tfrbert 单式Bertrand分布 tfrdfla D-Flandrin分布 tfrscalo 尺度图 tfrspaw 平滑伪Affine类Wigner分布 tfrunter Unterberger分布 五、Cohen类双核线性时频处理函数 tfrbj Born-Jordan分布 tfrbud Butterworth分布 tfrcw Choi-Williams分布 tfrgrd 归一化的矩形分布 tfrmh Margenau-Hill分布 tfrmhs Margenau-Hill频谱分布 tfrmmce 谱图的最小平均互熵组合 tfrpage Page分布 tfrwv 伪Wigner-Ville分布 tfrri Rihaczek分布 tfrridb 降低交叉项的分布(Bessel窗) tfrridbn 降低交叉项的分布(二项式窗) tfrridh 降低交叉项的分布(汉宁窗) tfrridt 降低交叉项的分布(三角窗) tfrsp 谱图分布 tfrspwv 平滑伪Wigner-Ville分布 tfrwv Wigner-Ville分布 tfrzam Zhao-Atlas-Marks分布 六、其他处理函数: friedman 瞬时频率密度 htl 图像直线检测的Hough变换 margtfr 时频表示的能量 momftfr 时频表示的频率矩 momttfr 时频表示的时间矩 renyi Renyi信息度量 ridges 波峰提取 plotifl 绘制归一化的瞬时频率规律 tfrparam 返回用于显示时频表示的参数 tfrqview 时频表示的快速可视化 tfrsave 保存时频表示的参数 tfrview 时频表示的可视化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值