จะยกเลิกการตั้งค่าตัวแปร JavaScript ได้อย่างไร


592

ฉันมีตัวแปรทั่วโลกใน JavaScript (จริง ๆ แล้วเป็นwindowคุณสมบัติ แต่ฉันไม่คิดว่ามันสำคัญ) ซึ่งได้รับการกรอกข้อมูลโดยสคริปต์ก่อนหน้านี้ แต่ฉันไม่ต้องการสคริปต์อื่นที่จะทำงานในภายหลังเพื่อดูค่าของมัน ที่กำหนดไว้

ฉันใส่some_var = undefinedแล้วมันใช้งานได้เพื่อจุดประสงค์ในการทดสอบtypeof some_var == "undefined"แต่ฉันไม่คิดว่ามันจะเป็นวิธีที่ถูกต้อง

คุณคิดอย่างไร?

คำตอบ:


454

deleteประกอบการเอาทรัพย์สินจากวัตถุ มันไม่สามารถลบตัวแปรได้ ดังนั้นคำตอบของคำถามขึ้นอยู่กับการกำหนดตัวแปรส่วนกลางหรือคุณสมบัติ

(1) ถ้าสร้างด้วยvarจะไม่สามารถลบได้

ตัวอย่างเช่น:

var g_a = 1; //create with var, g_a is a variable 
delete g_a; //return false
console.log(g_a); //g_a is still 1

(2) ถ้ามันถูกสร้างขึ้นโดยไม่varสามารถลบได้

g_b = 1; //create without var, g_b is a property 
delete g_b; //return true
console.log(g_b); //error, g_b is not defined

คำอธิบายทางเทคนิค

1. การใช้ var

ในกรณีนี้การอ้างอิงg_aถูกสร้างขึ้นในสิ่งที่ ECMAScript spec เรียกว่า " VariableEnvironment " ที่แนบมากับขอบเขตปัจจุบัน - นี่อาจเป็นบริบทการดำเนินการของฟังก์ชันในกรณีของการใช้varภายในฟังก์ชั่น (แม้ว่ามันอาจจะซับซ้อนกว่าเล็กน้อย เมื่อคุณพิจารณาlet) หรือในกรณีของรหัส "global" VariableEnvironmentจะถูกแนบกับวัตถุโกลบอล (บ่อยครั้งwindow)

อ้างอิงในVariableEnvironmentไม่ได้ตามปกติ deletable - ขั้นตอนรายละเอียดในECMAScript 10.5อธิบายในรายละเอียด แต่พอจะพูดได้ว่าถ้ารหัสของคุณจะถูกดำเนินการในevalบริบท (ซึ่งส่วนใหญ่เบราว์เซอร์ที่ใช้คอนโซลการพัฒนาใช้) จากนั้นตัวแปรประกาศด้วยvarไม่ได้ ถูกลบ

2. โดยไม่ต้องใช้ var

เมื่อพยายามกำหนดค่าให้กับชื่อโดยไม่ใช้varคำสำคัญจาวาสคริปต์จะพยายามค้นหาชื่อที่อ้างอิงในสิ่งที่ข้อมูลจำเพาะ ECMAScript เรียกว่า " LexicalEnvironment " และความแตกต่างที่สำคัญคือLexicalEvironmentนั้นซ้อนอยู่ - นั่นคือLexicalEnvironmentมีพาเรนต์ ( สิ่งที่ข้อมูลจำเพาะ ECMAScript เรียกว่า "การอ้างอิงสภาพแวดล้อมภายนอก") และเมื่อ Javscript ล้มเหลวในการค้นหาการอ้างอิงในLexicalEenvironmentมันจะดูในLexicalEnvironmentแม่(ตามรายละเอียดใน10.3.1และ10.2.2.1 ) ระดับสูงสุดของLexicalEnvironmentคือ " สภาพแวดล้อมทั่วโลก"และนั่นถูกผูกไว้กับออบเจ็กต์ทั่วโลกซึ่งการอ้างอิงนั้นเป็นคุณสมบัติของออบเจกต์โกลบอลดังนั้นหากคุณพยายามเข้าถึงชื่อที่ไม่ได้ประกาศโดยใช้varคำหลักในขอบเขตปัจจุบันหรือขอบเขตภายนอก Javascript จะดึงคุณสมบัติในที่สุด ของwindowวัตถุที่จะใช้เป็นข้อมูลอ้างอิงดังที่เราได้เรียนรู้มาก่อนคุณสมบัติในวัตถุสามารถลบได้

หมายเหตุ

  1. สิ่งสำคัญคือต้องจำไว้ว่าvarการประกาศเป็น "ยก" - กล่าวคือพวกเขามักจะคิดว่าจะเกิดขึ้นในช่วงต้นของขอบเขตที่พวกเขาอยู่ใน - แม้ว่าจะไม่เริ่มต้นค่าที่อาจจะทำในvarคำสั่ง - ที่เหลืออยู่ที่ไหน . ดังนั้นในรหัสต่อไปaนี้เป็นการอ้างอิงจากVariableEnvironmentไม่ใช่windowคุณสมบัติและค่าของมันจะอยู่10ที่ท้ายรหัส

    function test() { a = 5; var a = 10; }

  2. การสนทนาข้างต้นคือเมื่อไม่ได้เปิดใช้งาน "โหมดเข้มงวด" กฎการค้นหาแตกต่างกันเล็กน้อยเมื่อใช้ "โหมดเข้มงวด" และการอ้างอิงคำศัพท์ที่จะแก้ไขคุณสมบัติของหน้าต่างโดยไม่มี "โหมดเข้มงวด" จะเพิ่มข้อผิดพลาด "ตัวแปรที่ไม่ได้ประกาศ" ภายใต้ "โหมดเข้มงวด" ฉันไม่เข้าใจจริงๆว่ามีการระบุไว้ที่ไหน แต่มันเป็นวิธีการทำงานของเบราว์เซอร์


8
สิ่งที่คุณพูดเป็นความเข้าใจผิดที่พบบ่อย แต่ไม่ถูกต้องจริง - ใน Javascript ไม่มี "ตัวแปรทั่วโลก" ตัวแปรที่กำหนดโดยไม่ต้องมีขอบเขตที่ชัดเจน (เช่นการใช้varนอกฟังก์ชั่น) เป็นคุณสมบัติของวัตถุ "ทั่วโลก" windowซึ่งในเว็บเบราเซอร์เป็น ดังนั้น - var a = 1; delete window.a; console.log(a);จะประสบความสำเร็จในการลบตัวแปรและทำให้บรรทัดสุดท้ายออกข้อผิดพลาดในการอ้างอิง
Guss

7
@Guss รหัสของคุณvar a = 1; delete window.a; console.log(a);แสดง 1.
Dayong

5
ฉันใช้ Google Chrome v36 ฉันทดสอบกับเบราว์เซอร์อื่น ดูเหมือนว่าจะไม่สอดคล้องกับเบราว์เซอร์ข้าม Chrome และ Opera แสดง 1 ในขณะที่ Firefox, Safari และ IE 11 บนคอมพิวเตอร์ของฉันมีข้อผิดพลาด
Dayong

3
ตกลงความผิดของฉัน ดูecma-international.org/ecma-262/5.1/#sec-10.5 (จุดย่อย 2 และ 8.c.ii): เมื่อทำการทดสอบของฉันในคอนโซลนักพัฒนาซอฟต์แวร์โดยทั่วไปถือว่าเป็น "บริบทของการเปลี่ยนแปลง" (แม้ว่าอาจจะ ไม่ได้อยู่ใน Chrome) ดังนั้นมันจะทำให้เกิดข้อผิดพลาด รหัสเดียวกันในบริบททั่วโลกของเอกสารจริงจะส่งออก1อย่างถูกต้องในเบราว์เซอร์ทั้งหมด ทำงานในเอกสารจริงตัวอย่างรหัสของคุณถูกต้อง ฉันเลือกคำตอบของคุณถูกต้องแล้ว แต่ฉันยินดีถ้าคุณสามารถแก้ไขเพื่อให้อธิบายwindow.a = 1; delete window.a;และอาจเป็นกลไก ฉันสามารถทำได้เช่นกันถ้าคุณไม่รังเกียจ
Guss

2
@ KlaiderKlai ใช่ ตัวแปรขอบเขตของฟังก์ชันถูกสร้างและทำลายทุกครั้งเมื่อมีการดำเนินการฟังก์ชัน อาจปิดเป็นข้อยกเว้น
Dayong

278

คำตอบของ @ scunlife จะใช้ได้ แต่ในทางเทคนิคแล้วมันควรจะเป็น

delete window.some_var; 

การลบควรจะเป็นแบบไม่ใช้งานเมื่อเป้าหมายไม่ใช่คุณสมบัติของวัตถุ เช่น,

(function() {
   var foo = 123;
   delete foo; // wont do anything, foo is still 123
   var bar = { foo: 123 };
   delete bar.foo; // foo is gone
}());

แต่เนื่องจากตัวแปรทั่วโลกเป็นสมาชิกของวัตถุหน้าต่างจึงทำงานได้

เมื่อมีการเชื่อมโยงเชนต้นแบบการใช้การลบจะซับซ้อนมากขึ้นเพราะมันลบคุณสมบัติออกจากวัตถุเป้าหมายเท่านั้นไม่ใช่ต้นแบบ เช่น,

function Foo() {}
Foo.prototype = { bar: 123 };
var foo = new Foo();
// foo.bar is 123
foo.bar = 456;
// foo.bar is now 456
delete foo.bar;
// foo.bar is 123 again.

ดังนั้นระวัง

แก้ไข: คำตอบของฉันไม่ถูกต้องค่อนข้าง (ดู "ความเข้าใจผิด" ในตอนท้าย) ลิงก์จะอธิบายรายละเอียดเต็มไปด้วยเลือดทั้งหมด แต่สรุปคืออาจมีความแตกต่างใหญ่ระหว่างเบราว์เซอร์และขึ้นอยู่กับวัตถุที่คุณกำลังลบ โดยทั่วไปควรจะปลอดภัยตราบเท่าที่delete object.someProp object !== windowฉันยังคงไม่ใช้มันเพื่อลบตัวแปรที่ประกาศด้วยvarแม้ว่าคุณจะทำได้ภายใต้สถานการณ์ที่เหมาะสม


14
ขอบคุณ @jedierikb สำหรับลิงก์ไปยังบทความที่น่าสนใจ เพิ่มเติมเฉพาะในส่วนนี้ < perfectionkills.com/understanding-delete/#misconceptions > ของบทความที่ผู้เขียนระบุว่าคำสั่งของโนอาห์ "ลบควรจะเป็น no-op" ค่อนข้างไม่ถูกต้องพร้อมกับการแปลที่ยอดเยี่ยมว่าทำไมมันไม่ถูกต้อง . (อย่ายิงผู้ส่งสาร!)
Rob Wells

2
ในเรื่องเกี่ยวกับประโยคสุดท้ายของคำตอบที่แก้ไขสถานการณ์ที่เดียวที่คุณสามารถลบตัวแปรประกาศด้วยคือเมื่อตัวแปรที่ถูกประกาศด้วยvar eval
Stephen Booher

1
ในกรณีนี้คำสั่งลบจะไม่ปรากฏขึ้นเลย เกิดอะไรขึ้นที่นี่?
Anderson Green

@ AndersonGreen— สร้างตัวแปรส่วนกลางที่ถูกสร้างขึ้นด้วยแฟล็ก DontDeleteดังนั้นจึงไม่สามารถลบ รหัสนั้นทำงานตามที่คาดไว้
RobG

35

หากคุณกำลังปริยายประกาศตัวแปรโดยไม่ได้var, delete fooวิธีการที่เหมาะสมที่จะใช้

อย่างไรก็ตามหลังจากที่คุณลบหากคุณพยายามใช้สิ่งนี้ในการดำเนินการเช่นการเพิ่มReferenceErrorจะถูกโยนเพราะคุณไม่สามารถเพิ่มสตริงลงในตัวระบุที่ไม่ได้ประกาศและไม่ได้กำหนด ตัวอย่าง:

x = 5;
delete x
alert('foo' + x )
// ReferenceError: x is not defined

อาจปลอดภัยกว่าในบางสถานการณ์เพื่อกำหนดให้เป็นเท็จโมฆะหรือไม่ได้กำหนดดังนั้นจึงมีการประกาศและจะไม่ทิ้งข้อผิดพลาดประเภทนี้

foo = false

ทราบว่าใน ECMAScript null, false, undefined, 0, NaNหรือทุกคนจะประเมิน'' falseตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้!==โอเปอเรเตอร์ แต่!=เมื่อพิมพ์การตรวจสอบบูลีนและคุณไม่ต้องการการตรวจสอบตัวตน (เช่นnullนั้น== falseและfalse == undefined)

นอกจากนี้โปรดทราบdeleteว่าไม่ได้อ้างอิง "ลบ" แต่เป็นเพียงคุณสมบัติโดยตรงบนวัตถุเช่น:

bah = {}, foo = {}; bah.ref = foo;

delete bah.ref;
alert( [bah.ref, foo ] )
// ,[object Object] (it deleted the property but not the reference to the other object)

หากคุณประกาศตัวแปรด้วยvarคุณไม่สามารถลบได้:

(function() {
    var x = 5;
    alert(delete x)
    // false
})();

ในแรด:

js> var x
js> delete x
false

คุณไม่สามารถลบคุณสมบัติที่กำหนดไว้ล่วงหน้าได้เช่นMath.PI:

js> delete Math.PI
false

มีข้อยกเว้นแปลก ๆdeleteเช่นเดียวกับภาษาใด ๆ ถ้าคุณสนใจพอที่คุณควรอ่าน:


ขอบคุณสำหรับคำตอบที่สมบูรณ์พร้อมรายละเอียดทั้งหมด ฉันทำเครื่องหมายไว้สำหรับเรื่องนี้ แต่ฉันยอมรับคำตอบของโนอาห์เพราะฉันเชื่อว่าคำถามสั้น ๆ ง่ายๆนั้นสำคัญกว่าและทำให้สำเร็จ อีกครั้ง - ขอบคุณสำหรับการทำงานที่ยอดเยี่ยมที่คุณทำกับคำตอบนี้
Guss

30
some_var = null;

//or remove it..
delete some_var;

11
สิ่งนี้จะไม่ทำงานหากขอบเขตของรหัสนี้เป็นฟังก์ชั่น ดูคำตอบของ @ noah สำหรับวิธีแก้ไขที่ถูกต้อง
Roatin Marth

1
ขอบคุณสำหรับคำตอบ deleteแต่ฉันได้รับการยอมรับคำตอบของโนอาห์เพราะดีกว่าที่จะอธิบายถึงข้อผิดพลาดของ
Guss

3
ไม่ต้องกังวล ... ฉันให้คำตอบง่ายๆ "สกปรกอย่างรวดเร็ว" - @noah เพิ่มรายละเอียดทั้งหมดสำหรับกรณี "อื่น ๆ " ดังนั้นเขาจึงสมควรได้รับเครดิตเช่นกัน ;-)
scunliffe

7
สิ่งนี้ไม่ถูกต้อง deleteใช้ได้กับอสังหาริมทรัพย์เท่านั้น การตั้งค่าnullตัวแปรยังคงมีอยู่
Derek 朕會功夫

1
คำตอบนี้ดีพอสำหรับกรณีที่เป็นไปได้มากที่สุดที่คุณตรวจสอบด้วย "if (some_var) {.. }"
BearCode

16

TLDR: ง่ายตัวแปรที่กำหนดไว้ (ไม่var, let, const) deleteอาจจะถูกลบด้วย ถ้าคุณใช้var, let, const- พวกเขาไม่สามารถลบหรือด้วยหรือด้วยdeleteReflect.deleteProperty

Chrome 55:

simpleVar = "1";
"1"
delete simpleVar;
true
simpleVar;
VM439:1 Uncaught ReferenceError: simpleVar is not defined
    at <anonymous>:1:1
(anonymous) @ VM439:1
var varVar = "1";
undefined
delete varVar;
false
varVar;
"1"
let letVar = "1";
undefined
delete letVar;
true
letVar;
"1"
const constVar="1";
undefined
delete constVar;
true
constVar;
"1"
Reflect.deleteProperty (window, "constVar");
true
constVar;
"1"
Reflect.deleteProperty (window, "varVar");
false
varVar;
"1"
Reflect.deleteProperty (window, "letVar");
true
letVar;
"1"

FF Nightly 53.0a1 แสดงพฤติกรรมเดียวกัน


คำตอบของคุณถูกต้องทางเทคนิคดังนั้นคุณจะได้รับคะแนน แต่ทุกสิ่งที่คุณเขียนถูกครอบคลุมโดยคำตอบที่เลือกพร้อมรายละเอียดและการอ้างอิงรายละเอียด ECMAScript มากขึ้นในอนาคตจะเป็นประโยชน์ในการทบทวนคำตอบที่มีอยู่ก่อนโพสต์
Guss

5
ตกลง แต่มีเฉพาะvarกรณีที่กล่าวถึง สำหรับฉันมันเป็นเรื่องที่น่าสนใจในการทดสอบและแบ่งปันletและconstกรณีต่างๆ อย่างไรก็ตามขอขอบคุณที่ทราบ จะพยายามให้เจาะจงมากขึ้นในครั้งต่อไป
Serj.by

4

ECMAScript 2015 เสนอ Reflect API เป็นไปได้ที่จะลบคุณสมบัติของวัตถุด้วยReflect.deleteProperty () :

Reflect.deleteProperty(myObject, 'myProp');
// it is equivalent to:
delete myObject.myProp;
delete myObject['myProp'];

ในการลบคุณสมบัติของwindowวัตถุกลาง:

Reflect.deleteProperty(window, 'some_var');

ในบางกรณีคุณสมบัติไม่สามารถลบได้ (เมื่อคุณสมบัติไม่สามารถกำหนดค่าได้) จากนั้นฟังก์ชันนี้จะส่งคืนfalse(รวมถึงตัวดำเนินการลบ ) ในกรณีอื่น ๆ คืนค่าtrue:

Object.defineProperty(window, 'some_var', {
    configurable: false,
    writable: true,
    enumerable: true,
    value: 'some_val'
});

var frozen = Object.freeze({ myProperty: 'myValue' });
var regular = { myProperty: 'myValue' };
var blank = {};

console.log(Reflect.deleteProperty(window, 'some_var')); // false
console.log(window.some_var); // some_var

console.log(Reflect.deleteProperty(frozen, 'myProperty')); // false
console.log(frozen.myProperty); // myValue

console.log(Reflect.deleteProperty(regular, 'myProperty')); // true
console.log(regular.myProperty); // undefined

console.log(Reflect.deleteProperty(blank, 'notExistingProperty')); // true
console.log(blank.notExistingProperty); // undefined

มีความแตกต่างระหว่างdeletePropertyฟังก์ชั่นและdeleteผู้ปฏิบัติงานเมื่อทำงานในโหมดเข้มงวด:

'use strict'

var frozen = Object.freeze({ myProperty: 'myValue' });

Reflect.deleteProperty(frozen, 'myProperty'); // false
delete frozen.myProperty;
// TypeError: property "myProperty" is non-configurable and can't be deleted

4

ตัวแปรในทางตรงกันข้ามกับคุณสมบัติที่เรียบง่ายมีแอตทริบิวต์[[กำหนด]]หมายถึงความเป็นไปไม่ได้ที่จะลบตัวแปรผ่านตัวดำเนินการลบ อย่างไรก็ตามมีบริบทการดำเนินการหนึ่งที่กฎนี้ไม่ส่งผลกระทบต่อ เป็นบริบทของการวิวัฒนาการ : ไม่มีการตั้งค่า [แอตทริบิวต์ที่กำหนดค่าได้]] ไว้สำหรับตัวแปร


3

ตัวดำเนินการลบจะลบคุณสมบัติออกจากวัตถุ

delete object.property
delete object['property']

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

ตามคำถามที่คุณต้องการอย่างใดอย่างหนึ่งดังต่อไปนี้

delete some_var;
delete window.some_var;
delete window['some_var'];

3

นอกจากสิ่งที่ทุกคนเขียนแล้วโปรดทราบว่าdeleteผลตอบแทนแบบบูล มันสามารถบอกคุณได้ว่าการลบสำเร็จหรือไม่

การทดสอบบน Chrome ทุกอย่างยกเว้นการletถูกลบล้างได้ เมื่อdeleteส่งคืนtrueจะลบออกจริง:

implicit_global = 1;
window.explicit_global = 1;
function_set = function() {};
function function_dec() { };
var declared_variable = 1;
let let_variable = 1;

delete delete implicit_global; // true, tested on Chrome 52
delete window.explicit_global; // true, tested on Chrome 52
delete function_set; // true, tested on Chrome 52
delete function_dec; // true, tested on Chrome 52
delete declared_variable; // true, tested on Chrome 52
delete let_variable; // false, tested on Chrome 78

มันไม่ถูกต้องเสมอไป โดยเฉพาะใน Chrome Firefox คืนค่าทุกอย่างถูกต้อง ไม่ได้ทดสอบในเบราว์เซอร์อื่น ๆ สำหรับletvars และconstvars มันจะกลับมาจริงสิ่งที่ควรหมายความว่าตัวแปรนั้นถูกลบ แต่มันไม่ใช่ คุณสามารถตรวจสอบได้ทั้งใน Chrome และ FF FF ดูเหมือนจะคืนค่าที่ถูกต้องในขณะที่ Chrome ไม่ ดังนั้นอย่าแน่ใจว่าคุณสามารถไว้ใจได้ ลองดู:let letVar = "1"; undefined delete letVar; true letVar "1" typeof letVar; "string" const constVar="1"; undefined delete constVar; true constVar; "1" typeof constVar; "string"
Serj.by

1
ในฐานะที่เป็น jedierikb ที่กล่าวถึงด้านล่างมีบทความที่สมบูรณ์แบบโดย kangax perfectionkills.com/understanding-deleteที่ส่วนใหญ่อธิบายว่าทำไมและdeleteผู้ประกอบการทำงานอย่างไร แต่มันไม่ได้อธิบายว่าทำไมสถานการณ์ตรงข้ามกับฟังก์ชั่น เป็นที่น่าเสียดาย อย่างไรก็ตามเกี่ยวกับตัวแปรสิ่งต่าง ๆ เริ่มปรากฏชัดเจนยิ่งขึ้น
Serj.by

2

คุณไม่สามารถลบตัวแปรได้หากคุณประกาศ (พร้อม var x;) ณ เวลาที่ใช้ครั้งแรก อย่างไรก็ตามหากตัวแปร x ของคุณปรากฏตัวครั้งแรกในสคริปต์โดยไม่มีการประกาศคุณสามารถใช้ตัวดำเนินการลบ (ลบ x;) และตัวแปรของคุณจะถูกลบคล้ายกับการลบองค์ประกอบของอาร์เรย์หรือการลบคุณสมบัติของวัตถุ .


1

ฉันสับสนเล็กน้อย หากสิ่งที่คุณต้องการคือค่าตัวแปรที่จะไม่ส่งไปยังสคริปต์อื่นดังนั้นไม่จำเป็นต้องลบตัวแปรออกจากขอบเขต เพียงแค่ลบล้างตัวแปรแล้วตรวจสอบอย่างชัดเจนว่ามันเป็นหรือไม่เป็นโมฆะ ทำไมถึงมีปัญหาในการลบตัวแปรออกจากขอบเขต? เซิร์ฟเวอร์นี้มีวัตถุประสงค์อะไรที่ลบล้างไม่ได้?

foo = null;
if(foo === null) or if(foo !== null)

ข้อกำหนดคือสคริปต์คำสั่งที่ไม่ได้อยู่ภายใต้การควบคุมของฉันจะไม่เห็นว่ามีตัวแปรอยู่ - โดยเฉพาะสำหรับกรณี OP สคริปต์สคริปต์มีลักษณะการทำงานสำหรับnullค่าที่ฉันไม่ต้องการให้เรียกใช้
Guss

ไม่มี "แบ็กเอนด์" ถูกใช้ในระหว่างการผลิตคำถามนี้ นี่เป็นเพียงสคริปต์สองสามตัวในเว็บไซต์ที่ฉันไม่สามารถควบคุมอะไรได้นอกจากสคริปต์ตัวนี้
Guss

สคริปต์ทั้งสองอยู่ในเอกสารเดียวกันหรือในเอกสารที่แยกกันที่คู่กันโหลดหรือไม่ คุณพูดถึงสคริปต์คำสั่งซื้อและสคริปต์เป้าหมาย ถ้ามันเป็นเรื่องของตัวแปรที่ถูกส่งผ่านไปยังสคริปต์อื่นผ่านทางตัวแปร get / post ฉันจะลบมันในแบ็กเอนด์ก่อนที่จาวาสคริปต์ใด ๆ จะเข้ามาแทนที่ ตัวอย่างของสิ่งนี้ใน php จะเป็นอย่างไร <?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>
designdrumm

ฉันเห็น. ถ้ามีการตรวจสอบและถ่วงดุลของค่าว่างแล้วให้ตั้งค่าเป็นค่าสคริปต์เป้าหมายจะไม่ทำอะไรกับมันดูเหมือนว่าจะมีเหตุผลมากกว่านั้นแล้วลบตัวแปรออกจากขอบเขต แต่คุณดูมีคำตอบดังนั้นฉันจะปล่อยให้ม้านอน ขอบคุณสำหรับคำตอบของคุณ
designdrumm

คำถามด่วนหนึ่งข้อ จะมีสคริปต์ที่ถูกเรียกหลังจากคุณซึ่งจะไม่อยู่ในการควบคุมของคุณ แต่จะยังต้องการตัวแปรนี้อยู่หรือไม่? ถ้าเป็นเช่นนั้นการลบตัวแปรออกจากขอบเขตเป็นความคิดที่ไม่ดี
designdrumm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.