关于告诉是否通过查看self [name]定义了Javascript函数:告诉是否通过查看self [name]定义了Javascript函数-这是一个好方法吗?

关于告诉是否通过查看self [name]定义了Javascript函数:告诉是否通过查看self [name]定义了Javascript函数-这是一个好方法吗?

Tell if a Javascript function is defined by looking at self[name] - is this a good way?

这是此问题的后续问题。

我喜欢(并理解)那里的解决方案。 但是,在我正在使用的代码中,使用了另一种解决相同问题的方法:

1
2
3
4
function exist(sFN) {
    if(self[sFN]) return true;
    return false;
}

尽管我不知道该怎么做,但似乎工作正常。 能行吗 怎么样? 这种方法有什么缺点? 我应该从另一个问题转向解决方案吗?


尝试这个:

1
2
3
function exist(sFN) {
 return (typeof sFN == 'function');
}

您的条件是检查"自身"对象中是否存在" sFN"属性。任何不为null,undefined,0和"的值都将评估为true。

正如其他人所说,您可以使用typeof或instanceof来查看它是否实际上是一个函数。

查看链接的示例,您应该阅读JavaScript中== /!=和=== /!==之间的区别。简短答案:(" == null)为true,(" === null)为false。


只需使用typeof

1
2
typeof(foobar)  // -> undefined
typeof(alert)   // -> function

但是,您不能基于typeof定义函数,因为您需要传递一个可能不存在的标识符。因此,如果定义function isfun(sym) { return typeof(sym) },然后尝试调用isfun(inexistent),则会抛出代码。

typeof的有趣之处在于它是一个运算符,而不是一个函数。因此,您可以使用它来检查未定义的符号而无需抛出。

如果您假设函数在全局范围内(即不在闭包内),则可以定义一个函数来检查它,如下所示:

1
2
3
function isfun(identifier) {
  return typeof(window[identifier]) == 'function';
}

在这里,您为标识符传递了一个字符串,因此:

1
2
isfun('alert');   // -> true
isfun('foobar');  // -> false

关闭?

这是在闭包中定义的函数的示例。在这里,打印值将是false,这是错误的。

1
2
3
4
(function closure() {
  function enclosed() {}
  print(isfun('enclosed'))
})()

仅供参考:typeof有一个(或曾经有)陷阱。

FF2返回typeof(/ pattern /)的"函数"。
FF3,IE7和Chrome都针对同一代码返回"对象"。
(我无法验证其他浏览器。)

假设使用FF2的每个人都进行了升级,那么您很清楚。
但是,这可能是一个牵强的假设。


Object.prototype.toString.apply(value)==='[对象功能]'


您不能真的将其包装在一个方法中,但是它是如此简单,实际上并不需要。

1
2
3
4
5
6
7
8
function bob()
{}

if( typeof bob =="function" )
    alert("bob exists" );

if( typeof dave !="function" )
    alert("dave doesn't" );


我在某处(这里和这里)读到函数是窗口对象的属性,因此您可以执行以下操作:

1
2
3
if (window.my_func_name) {
    my_func_name('tester!');
}

或弹出窗口:

1
2
3
if (window.opener.my_func_name) {
    my_func_name('tester!');
}

完整的解决方案是:

1
2
3
4
5
6
7
8
9
function function_exists(func_name) {
    var eval_string;
    if (window.opener) {
        eval_string = 'window.opener.' + func_name;
    } else {
        eval_string = 'window.' + func_name;
    }
    return eval(eval_string + ' ? true : false');
}

推荐阅读

    linux命令定义详解?

    linux命令定义详解?,工作,系统,管理,命令,信息,单位,数据,基础,简介,目录,Lin

    linux调用函数的命令?

    linux调用函数的命令?,系统,代码,策略,上调,时间,设计,通信,网络,设备,项目,

    linux命令和库函数?

    linux命令和库函数?,系统,标准,管理,地址,服务,库函数,环境,平台,第一,状态,1

    linux命令解决方案?

    linux命令解决方案?,系统,管理,数据,电子,工作,电脑,软件,情况,不了,档案,lin

    linux查看函数命令?

    linux查看函数命令?,系统,信息,名称,命令,位置,情况,公用,名字,标准,资料,lin

    创建自定义命令linux?

    创建自定义命令linux?,工具,状态,命令,系统,代码,标准,数据,位置,电脑,材料,L

    linux自定义命令行?

    linux自定义命令行?,系统,工作,名称,百度,命令,管理,工具,位置,信息,终端,Lin

    linux配置自定义命令?

    linux配置自定义命令?,服务,系统,状态,策略,周期,地方,标准,新增,环境,工具,L

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    自定义命令linux命令?

    自定义命令linux命令?,工具,系统,数据,命令,新增,代理,通信,地方,信息,时间,

    linux命令行定义参数?

    linux命令行定义参数?,系统,信息,名称,实时,命令,百分比,工作,周期,选项,参

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux自定义简写命令?

    linux自定义简写命令?,系统,工作,命令,标准,地址,基础,信息,软件,目录,文件,

    linux命令简写自定义?

    linux命令简写自定义?,系统,状态,命令,代码,工具,发行,标准,软件,文件,别名,L

    linux用户自定义命令?

    linux用户自定义命令?,系统,时间,标准,软件,项目,电脑,服务,工具,基本知识,

    linux自定义快捷命令?

    linux自定义快捷命令?,系统,首次,位置,时间,文件,命令,链接,快捷键,终端,桌

    linux查询函数命令?

    linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Lin

    linux自定义全局命令?

    linux自定义全局命令?,环境,系统,命令,别名,新增,信息,地方,文件,定义,用户,

    linux命令输入方法?

    linux命令输入方法?,系统,电脑,密码,管理,地址,命令,网站,工具,首开,位置,lin