1

指定された変数名が JavaScript エンジンまたはブラウザーによって既に定義されている場合、true を返す関数が必要です。

例えば

isNative('window') //true;
isNative('Math') //true;
isNative('myVar') //false
isNative('navigator') //true
isNative('document') //true
4

5 に答える 5

3

私は解決策を見つけました。

function isNative(variableName) {
    if (window['__emptyIframeRef__'] === undefined) {            
        window['__emptyIframeRef__'] = document.createElement('iframe');
        window['__emptyIframeRef__'].setAttribute('style', 'display:none');
        document.getElementsByTagName('body')[0].appendChild(window['__emptyIframeRef__']);
    }
    return window['__emptyIframeRef__'].contentWindow[variableName] !== undefined;
}
于 2013-12-01T16:13:30.137 に答える
1

これはあなたが望むものではないと思います。まず最初に。グローバル変数は悪いです。したがって、独自のロジック/モジュール/関数をすべて含む独自の名前空間が必要です。

var danial={
    module1:{
        get:function(bla){...}
    },
    module2:(function(){
        ....
    }());
}

現在、ネイティブのオブジェクト/関数と自己定義のものの間に違いはありません。それらはすべて、プロトタイプ チェーンの上にオブジェクト プロトタイプを持っており、区別する方法はありません。ただし、オブジェクトがプロパティ自体を持っている場合、またはプロトタイプチェーンを介して「継承」されている場合、たとえば toString は常に存在しますが、オブジェクトに属していません (定義してオーバーライドしていない限り)。次のコードで確認できます

for (var prop in obj) {
    if( obj.hasOwnProperty( prop ) ) {
        console.log("own property", prop, obj[prop]);
    } 
}
于 2013-12-01T16:01:16.807 に答える
0

http://jsfiddle.net/7h3su/で確認してください

function isNative(variableName){
    return window[variableName]!=undefined;
}
alert(isNative('window')) //true;
alert(isNative('Math')) //true;
alert(isNative('myVar')) //false
alert(isNative('navigator')) //true
alert(isNative('document')) //true
于 2013-12-01T15:42:38.493 に答える