Ich habe eine ziemlich nützliche Funktion zur Identifizierung von Datentypen konstruiert; Aber während ich glücklich codierte, wurde ich grob durch ein ziemlich beunruhigendes Dilemma unterbrochen.JavaScript - Zugriff auf Eigenschaften nach (Schließung) .bind()
Wie Sie vielleicht wissen, können Sie nach dem Aufruf .bind({foo:'bar'})
auf eine Schließung nicht zugreifen foo
Eigenschaft "extern"; Innerhalb des Verschlusses funktioniert this.foo
jedoch.
Auch wenn Sie etwas so zuweisen, stehen Sie oft vor einem Wurf: intermediary ... blah blah is undefined
, wenn Sie versuchen, auf eine Eigenschaft zuzugreifen - direkt nach der Definition. Der folgende Code behebt diese Probleme, aber ...
Das Problem nach dem Code erklärt:
"use strict";
if ('undefined' == typeof global)
{
Object.defineProperty
(
window,'global',
{
writable:false,
configurable:false,
enumerable:false,
value:window
}
);
}
Object.defineProperty
(
Function.prototype, 'wrap',
{
writable:false,
enumerable:false,
configurable:false,
value:function(jsob)
{
this.bind(jsob);
for (var i in jsob)
{ this[i] = jsob[i]; }
return this;
}
}
);
global.typeOf = function(data)
{
if ((data === null) || (data === undefined))
{ return 'void'; }
if ((data === true) || (data === false))
{ return 'bool'; }
var tpof = (({}).toString.call(data).match(/\s([a-zA-Z]+)/)[1].toLowerCase());
if ((tpof == 'array') || (tpof == 'htmlcollection') || (tpof == 'namednodemap'))
{ return 'list'; }
if ((tpof == 'global') || (tpof == 'window'))
{ return 'glob'; }
switch (tpof.substr(0,6))
{
case 'number': return 'unit';
case 'string': return (/[^\x20-\x7E\t\r\n]/.test(data) ? 'blob' : 'text');
case 'object': return 'jsob';
case 'functi': return 'func';
default: return 'node';
}
}
.wrap
({
list:'void bool unit text blob list jsob func node glob'.split(' '),
init:function()
{
this.list.forEach(function(item)
{
global[(item.toUpperCase())] = item;
global[('is'+(item[0].toUpperCase() + item.substr(1,item.length)))] = function(data)
{
return ((typeOf(data) == this.text) ? true : false);
}
.bind({text:item.toLowerCase()}); // <-- ISSUE
});
return this;
}
}).init();
So der kleine wrapper
oben kümmert sich um solche Verrücktheit; Sehen Sie sich jedoch die Zeile <-- ISSUE
an. siehe, ich kann wrap()
dort nicht verwenden, muss ich bind()
verwenden, sonst - innerhalb der Funktion - this
ist undefined !!
Lassen Sie mich klarstellen: Wenn Sie den gesamten Code verwenden, wie es oben in <script>
Tags innerhalb einer Brand-Spanking-neue HTML-Datei ist; Ändern Sie einfach das ISSUE
Linie bind
Wort zu: wrap
; versuchen dann so etwas wie: isText("bite me!");
Sie einen Fehler sehen, dass so etwas gibt: von undefined
kann nicht lesen Eigenschaft "text" ..
so; wenn Sie eine console.log(this)
innerhalb dieser Funktionsdefinition dort machen; Sie werden undefined
sehen.
Wenn jemand helfen könnte, dies zu beheben, oder zumindest erklären, warum dies geschieht, würde ich den Input sehr schätzen.
@Kashif :: Die 'wrap()' Methode ermöglicht den Zugriff auf Eigenschaften -extern von der Schließung. Es verkürzt auch den Code, der benötigt wird. – argon
@deceze :: der ganze Code könnte Teil des Problems sein; und - der Code ist wie er ist verwendbar, einfach kopieren + einfügen & test; nichts "fehlt" überhaupt. – argon
Scheint so, als ob das Problem, mit dem Sie es zu tun haben, dasselbe ist wie das, das Sie beheben wollen. Die eingepackten isX-Funktionen können nicht von dem umschlossenen Verschluss auf "dieses" zugreifen. Ich vermute, du fragst praktisch nach einer Erklärung für deine "Mistlosigkeit" – Tibrogargan