logfunc
「定義されていない」のはなぜですか?
var logfunc = function(obj) {
return function() {
console.log(obj)
}
}
t += '<a onclick="logfunc(this)"><</a>'
logfunc
「定義されていない」のはなぜですか?
var logfunc = function(obj) {
return function() {
console.log(obj)
}
}
t += '<a onclick="logfunc(this)"><</a>'
への参照longfunc
は、グローバル スコープの外で宣言されている場合はアクセスできません。フィドル
省略してグローバルスコープで変数を直接宣言することを推奨しているわけではありませんvar
が、良い例になります。
function setupStuff() {
var logfunc = function(obj) { //defined within setupStuff scope
/*...*/
}
t += '<a onclick="logfunc(this)"><</a>';
}
function setupStuffDifferently() {
logfuncB = function(obj) { //defined in the global scope
/*...*/
}
t += '<a onclick="logfuncB(this)"><</a>';
}
のように個別に宣言された関数を見たいと思います
t += '<a onclick="logfunc(this)"><</a>';
function logfunc(obj) { //this would work when assigned through `onclick`
/*...*/
}
オプションが利用可能な場合は、jQuery などのライブラリを使用することをお勧めします。これにより、クリック イベントの割り当てと処理がより柔軟になります。
「logfunc が定義されていません」というエラーが発生します。logfunc
これは、グローバル (つまりwindow
) スコープ内になく、HTML 要素属性を使用してバインドされた関数がグローバルである必要があるためです。
次のように言うことで、それを回避できます。
window.logfunc = function(obj) {
return function() {
console.log(obj)
}
};
logfunc
しかし、呼び出す関数を返すだけで、関数を呼び出すことconsole.log
に<a>
なっていることがわからないため、それはあなたが思っていることをしません。function() { console.log(obj) }
それは単にそれを真の値として見るだけです。私はあなたが欲しいと思います:
window.logfunc = function(obj) {
console.log(obj)
};
リンクをクリックしてコンソール メッセージを生成する場合。
onclick
「 DOM との違いは何ですか」に関する限り、次のようになります。
onclick
呼び出すことができますaddEventListener
。JavaScript スニペットを文字列として一緒に貼り付けたい場合は、この制限を回避できますが、これは厄介です。addEventListener
を使用して呼び出しを簡単に元に戻すことができます。removeEventListener
属性からイベント ハンドラーを削除すると、onclick
追加するよりも厄介な文字列のラングリングが発生します。onclick
すると、HTML と JavaScript が絡み合い、メンテナンスの悪夢につながります。